<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
今天看到一篇特別好的文章,翻譯其中一小段Understanding how the JVM uses native memory
Runtime環境提供了被某些未知的使用者程式碼驅動的能力,這使runtime在任何情況下都能使用合適的資源。每一個JVM管理的java應用的行為都會潛在的影響JVM所能提供的執行時環境。這一節我們討論為什麼Java應用會消耗native儲存
Java的堆是用來儲存分配物件的一塊記憶體,大多數的JVM有一塊邏輯堆記憶體,也有少數的JVM實現了多塊堆儲存。一個實體記憶體可以基於GC被分配成多塊邏輯上的記憶體。
JIT編譯器會把java位元組碼編譯成執行時可以直接執行的機器碼,這極大的提升了JRE執行速度,使Java程式碼執行比肩native code。
位元組碼編譯會使用native記憶體(同理,一些像GCC這樣的編譯器也需要記憶體去run),但是JIT的輸入(位元組碼)輸出(機器碼)都必須儲存在native記憶體中。所以包含很多JIT-compiled的方法的應用相對來說更佔用native記憶體。
Java程式由定義了物件和方法邏輯的類組成,可能是Java執行時的庫(比如java.lang.String),也可能是三方庫。這些class在被使用的時候會被載入進來並被儲存在記憶體裡面。
class如何被儲存不同JVM的實現相差極大。Sun JDK儲存在永生帶(PermGen),IBM從Java5開始為每個classloader開闢native記憶體並將它們儲存在那裡。具體的儲存位置需要檢視實現的檔案。
顯而易見的是,用更多的類會消耗更多的記憶體。(這意味著你的native記憶體消耗會持續增加,或者明確的開闢一塊記憶體,像PermGen,去容納所有的class),需要注意的是不止是你的應用的class需要儲存,frameworks,application servers,三方庫,JRE這裡面的class在被用到的時候都會被載入並儲存進來。
JRE允許解除安裝class去回收空間,但是這僅僅是在記憶體嚴重不足的情況下。不可能僅僅解除安裝一個單獨的class檔案,而是解除安裝classloader,和它載入進來的所有class,一個classloader僅僅會在以下情況下被解除安裝:
JNI允許原生程式碼和java程式碼相互呼叫。JRE嚴重依賴JNI程式碼去實現檔案和網路這些類庫的功能,一個JNI應用能以三種方式增加JRE的native記憶體
NIO是java1.4之後新增的API,基於管道和快取,以一種新的方式實現IO操作。除了基於堆的I/O,NIO還新增了基於native記憶體的direct ByteBuffer(通過java.nio.ByteBuffer.allocateDirect()方法分配)。Direct ByteBuffers可以直接呼叫系統庫的方法去實現I/O操作,這會顯示提升在某些場景下的執行效率,因為能避免在Java堆和native堆之間拷貝資料。
我們可能會疑惑direct ByteBuffer申請的記憶體到底存在哪裡,應用仍然用的是Java堆裡面的物件去完成I/O操作,但是持有資料的快取仍然存在native記憶體中 -Java堆的物件只是持有了一個native堆快取的參照。一個non-direct ByteBuffer則是直接在Java堆中儲存了byte[]陣列。
Memory topology for direct and non-direct java.nio.ByteBuffers
Java堆發生GC的時候同樣會對Direct ByteBuffer資料執行清除native快取操作,GC僅僅會在Java堆中已經滿了,不支援新的堆空間分配或者程式手動呼叫GC(不建議手動呼叫GC)的情況下發生。
還有一種情況,native記憶體已經滿了,又有程式碼來請求native記憶體,但是這個時候Java堆還沒有達到GC的條件,所以並不會發生GC。(也就是說native記憶體的GC完全依賴Java堆的GC,反之如果native需要GC了但是堆沒有GC的需求的則不會引發GC)
應用的每一個執行緒都需要記憶體去儲存它的棧(這塊記憶體用來儲存本地變數表和儲存狀態),每一個Java執行緒都需要棧去執行,根據實現,Java執行緒可以具有單獨的native和Java棧。除了堆疊空間之外,每個執行緒還需要一些native記憶體用於thread-local儲存和內部資料結構。
堆疊大小因Java實現和架構而異。某些實現允許您指定Java執行緒的堆疊大小。通常在256KB和756KB之間的值。
儘管每個執行緒使用的記憶體量非常小,但對於具有數百個執行緒的應用程式,執行緒堆疊的總記憶體使用量可能很大。執行具有比可用處理器多的執行緒來執行它們的應用程式通常是低效的,並且可能導致效能低下以及增加的記憶體使用。
以上就是教你JVM怎麼使用native memory的詳細內容,更多關於JVM使用native memory的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45