1. 程式人生 > >哪個更快:Java堆還是本地記憶體

哪個更快:Java堆還是本地記憶體

使用Java的一個好處就是你可以不用親自來管理記憶體的分配和釋放。當你用new關鍵字來例項化一個物件時,它所需的記憶體會自動的在Java堆中分配。堆會被垃圾回收器進行管理,並且它會在物件超出作用域時進行記憶體回收。但是在JVM中有一個‘後門’可以讓你訪問不在堆中的本地記憶體(native memory)。在這篇文章中,我會給你演示一個物件是怎樣以連續的位元組碼的方式在記憶體中進行儲存,並且告訴你是應該怎樣儲存這些位元組,是在Java堆中還是在本地記憶體中。最後我會就怎樣從JVM中訪問記憶體更快給一些結論:是用Java堆還是本地記憶體。

使用Unsafe來分配和回收記憶體

sun.misc.Unsafe

可以讓你在Java中分配和回收本地記憶體,就像C語言中的mallocfree。通過它分配的記憶體不在Java堆中,並且不受垃圾回收器的管理,因此在它被使用完的時候你需要自己來負責釋放和回收。下面是我寫的一個使用Unsafe來管理本地記憶體的一個工具類:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 public class Direct implements Memory { private static Unsafe unsafe; private static boolean AVAILABLE = false; static { try { Field field = Unsafe.class.getDeclaredField("theUnsafe"); field.setAccessible(true);

相關推薦

哪個Java還是本地記憶體

使用Java的一個好處就是你可以不用親自來管理記憶體的分配和釋放。當你用new關鍵字來例項化一個物件時,它所需的記憶體會自動的在Java堆中分配。堆會被垃圾回收器進行管理,並且它會在物件超出作用域時進行記憶體回收。但是在JVM中有一個‘後門’可以讓你訪問不在堆中的本地

院長告訴你Java本地記憶體到底哪個

使用Java的一個好處就是你可以不用親自來管理記憶體的分配和釋放。當你用new關鍵字來例項化一個物件時,它所需的記憶體會自動的在Java堆中分配。堆會被垃圾回收器進行管理,並且它會在物件超出作用域時進行記憶體回收。但是在JVM中有一個‘後門’可以讓你訪問不在堆中的本地記憶體(native memory)。在

Java 應用執行效能調優工具及實踐

Java 應用效能優化是一個老生常談的話題,筆者根據個人經驗,將 Java 效能優化分為 4 個層級:應用層、資料庫層、框架層、JVM 層。通過介紹 Java 效能診斷工具和思路,給出搜狗商業平臺的效能優化案例以供參考。Java 應用效能優化是一個老生常談的話題,典型的效能問

[譯] 使 WebAssembly Firefox 的新流式和分層編譯器

原文地址:Making WebAssembly even faster: Firefox’s new streaming and tiering compiler 原文作者:Lin Clark 譯文出自:掘金翻譯計劃 本文永久連結:github.com/xitu/gold-m…

比NGINXnginx-1.15.5 vs mongols-1.2.3

nginx是多程序web伺服器的優秀代表。 本文要用mongols-1.2.3實現一個比nginx更快的多程序的web伺服器。 mongols是C++ 伺服器基礎設施庫, 它的主要特性如下: tcp 伺服器 http 伺服器 websocket 伺服器 web 伺服器 leveldb 伺服器 lua 伺服器

IBM MQ 9.1 教程二Java程式碼訪問本地佇列

1.匯入MQ訪問jar包 可通過maven匯入所需jar包 <dependency> <groupId>com.ibm.mq</groupId> <artifactId>com.ibm.mq.allclient</ar

比反射委託 第3部分

目錄 泛型方法 靜態泛型方法 例項泛型方法 事件  事件新增訪問器 事件刪除訪問者 總結 現在是時候介紹以下成員了。 泛型方法 事件 泛型方法 以前我們沒有介紹C#關於方法的非常重要的特性。如果您閱讀本節的標題,您已經知道

比反射委託 第2部分

目錄 建構函式 靜態方法 例項方法 總結  GitHub和Nuget包中提供了具有新功能和錯誤修復的程式碼。 現在是時候介紹以下成員了。(如想了解欄位、屬性等情況,可檢視上一篇文章) 靜態的 方法 例

比反射委託 第1部分

目錄 為什麼不用反射? 委託一切 靜態屬性 獲取訪問器(get accessors) 設定訪問器(set accessors) 改進 屬性 改進 索引器 改進 Setters 靜態欄位 獲取靜態欄位值 設定靜態欄位值 欄位 獲取欄位

Java外直接記憶體回收

JVM引數設定:-XX:MaxDirectMemorySize=20M import java.nio.ByteBuffer; import sun.nio.ch.DirectBuffer; public class DirectMemoryOOM { publ

Java程序性能優化讓你的Java程序穩定

ont AD 軟件設計 mar 並行 stroke 平臺 align 虛擬 Java是目前應用為廣泛的軟件開發平臺,學習針對Java程序的優化方法有重要的現實意義。《Java程序性能優化:讓你的Java程序更快、更穩定》以Java性能調優為主線,系統地闡述了與Java性能優

目錄 1.1. JVM記憶體模型總體架構圖 1 1.2. JAVA 2 1.3. 方法區 元空間(Metaspace) 2 1.4. 虛擬機器棧 3 1.5. 本地方法區 4 2. 垃圾回收演算法 4 2

目錄 1.1. JVM記憶體模型總體架構圖 1 1.2. JAVA堆 2 1.3. 方法區 元空間(Metaspace) 2 1.4. 虛擬機器棧 3 1.5. 本地方法區 4 2. 垃圾回收演算法 4 2.1. 標記-清除演算法(Mark-Sweep) 4

Java記憶體本地記憶體分析神器 NMT 和 pmap

背景 其他團隊的一些同事經常問我一個問題:你的Java程序怎麼佔了那麼多Virtual Size和RSS? 最近,我基本上可以回答清楚這個問題了。用NMT和pmap基本就就能搞清楚Java程序為什麼佔了那些Virtual Size和RSS。 NMT是Nativ

一步步優化JVM四決定Java的大小以及記憶體佔用

   young代的初始值和最小值。<n>是大小,[g|m|k]表示單位是G位元組,M位元組或者千位元組。young代的大小不會小於這個值。當設定-XX:NewSize=<n>[g|m|k]的時候,-XX:MaxNewSize=<n>[g|m|k]需要被指定。

js指令碼載入方式本地載入與cdn雲加速載入那個速度

本地載入 CDN雲載入 (1) 只把hifhstock.js改為CDN載入: 結果:250ms大於151ms,cdn雲載入速度慢,比本地載入慢100多ms (2)只把jquery-3.2

JAVA的JVM的記憶體可分為3個區(heap)、棧(stack)和方法區(method)

堆區:1.儲存的全部是物件,每個物件都包含一個與之對應的class的資訊。(class的目的是得到操作指令)2.jvm只有一個堆區(heap)被所有執行緒共享,堆中不存放基本型別和物件引用,只存放物件本身.3.一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能

Android效能優化手把手教你如何讓App穩、省(含記憶體、佈局優化等)

前言 在 Android開發中,效能優化策略十分重要 因為其決定了應

Java記憶體是執行緒共享的!面試官你確定嗎?

Java作為一種面向物件的,跨平臺語言,其物件、記憶體等一直是比較難的知識點,所以,即使是一個Java的初學者,也一定或多或少的對JVM有一些瞭解。可以說,關於JVM的相關知識,基本是每個Java開發者必學的知識點,也是面試的時候必考的知識點。 在JVM的記憶體結構中,比較常見的兩個區域就是堆記憶體和棧記憶

面試題JVM在Java中對物件的建立、記憶體結構、訪問方式

  一、物件建立過程   1、檢查類是否已被載入     JVM遇到new指令時,首先會去檢查這個指令引數能否在常量池中定位到這個類的符號引用,檢查這個符號引用代表的類是否已被載入、解析、初始化,若沒有,則進行類載入   2、為新物件分配記憶體      類載入檢查後,JVM為新物件在堆記憶

jstackjava線程的調用

我們 令行 com png ive 附加 java線程 bsp 基本   jdk提供的jstack我們通過名字就能很好地理解,這個工具是和棧分不開的 我們看一組jdk工具的命令行,通過這個命令行來理解最基本的用法 可以理解出來,大致跟的幾個參數,以及我們的java進程 -