【JVM】10、直接內存

參考

native memory 和direct memory

這部分參考

  • JVM管理的內存可以總體劃分爲兩部分:Heap Memory和Native Memory。
  • Native Memory和Off-heap是一個概念,沒有相應的參數來控制大小,其大小依賴於操作系統進程的最大值。
  • direct memory 意味着用java.nio.DirectByteBuffer.的方式用native memory
  • Native heap means you use native memory by means of unsafe.allocateMemory or simply do a malloc in your JNI code.

metaspace 是存在native memory的,是有GC的。而direct memory是沒有gc的

native memory 存什麼

1.管理java heap的狀態數據(用於GC);
2.JNI調用,也就是Native Stack;
3.JIT(即使編譯器)編譯時使用Native Memory,並且JIT的輸入(Java字節碼)和輸出(可執行代碼)也都是保存在Native Memory;
4.NIO direct buffer。對於IBM JVM和Hotspot,都可以通過-XX:MaxDirectMemorySize來設置nio直接緩衝區的最大值。默認是64M。超過這個時,會按照32M自動增大。
5.對於IBM的JVM某些版本實現,類加載器和類信息都是保存在Native Memory中的。



直接內存

  1. 直接內存不是虛擬機運行時數據區的一部分,也不是《Java虛擬機規範》中定義的內存區域。
  2. 直接內存是在Java堆外的、直接向系統申請的內存區間。
  3. 來源於NIO,通過存在堆中的DirectByteBuffer操作Native內存
  4. 通常,訪問直接內存的速度會優於Java堆。即讀寫性能高。
  5. 因此出於性能考慮,讀寫頻繁的場合可能會考慮使用直接內存。
  6. Java的NIO庫允許Java程序使用直接內存,用於數據緩衝區

BIO 與NIO

NIO

IO NIO
是最初的講如何實現數據傳輸的規範 NIO(New IO/Non-Blocking IO)
阻塞式的 非阻塞式的
基礎傳輸工具 byte[]/char[] Buffer
Stream Channel

NIO是通過DirectByBuffer操作Native內存的

在這裏插入圖片描述
allocateDirect方法幫我們創建了直接內存(DirectByBuffer就是直接本地內存的對象
在這裏插入圖片描述

非直接緩存區(BIO)

原來採用BIO的架構,在讀寫本地文件時,我們需要從用戶態切換成內核態
在這裏插入圖片描述

直接緩衝區(NIO)

NIO 直接操作物理磁盤,省去了中間商賺差價
在這裏插入圖片描述

直接內存與 OOM

直接內存大小設置

直接內存大小可以通過MaxDirectMemorySize設置
如果不指定,默認與堆的最大值-Xmx參數值一致

java.lang.OutOfMemoryError: Direct buffer memory

直接內存也可能導致OutofMemoryError異常

在這裏插入圖片描述
直接內存和Java堆沒有關係,但是系統內存是有限的,Java堆和直接內存的總和依然受限於操作系統能給出的最大內存。
在這裏插入圖片描述

直接內存缺點

分配回收成本較高
不受JVM內存回收管理

JVM內存結構

簡單理解java process memory = java heap + native memory
可以把棧、PC寄存器那些的忽略不計
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章