JVM学习笔记之-对象的实例化,内存布局与访问定位,直接内存(Direct Memory)
對象的實例化
對象的內存布局
圖解
對象的訪問定位
句柄訪問
好處
reference中存儲穩定句柄地址,對象被移動(垃圾收集時移動對象很普遍)時只會改變句柄中實例數據指針即可,reference本身不需要被修改。
直接指針(hotspot采用)
直接內存(Direct Memory)
概述
不是虛擬機運行時數據區的一部分,也不是《Java虛擬機規范》中定義的內存區域。
直接內存是在Java堆外的、直接向系統申請的內存區間。
來源于NIO,通過存在堆中的DirectByteBuffer操作Native內存
通常,訪問直接內存的速度會優于Java堆。即讀寫性能高。
因此出于性能考慮,讀寫頻繁的場合可能會考慮使用直接內存。
Java的NIo庫允許Java程序使用直接內存,用于數據緩沖區
也可能導致outofMemoryError異常
由于直接內存在Java堆外,因此它的大小不會直接受限于-xmx指定的最大堆大小,但是系統內存是有限的,Java堆和直接內存的總和依然受限于操作系統能給出的最大內存。
缺點
分配回收成本較高不受
JVM內存回收管理
直接內存大小可以通過MaxDirectMemorysize設置
如果不指定,默認與堆的最大值-xmx參數值一致
案列
package com.fs.method;import java.nio.ByteBuffer; import java.util.Scanner;public class BufferTest {private static final int BUFFER = 1024 * 1024 * 1024; //1GBpublic static void main(String[] args) {ByteBuffer byteBuffer = ByteBuffer.allocateDirect(BUFFER);System.out.println("直接內存分配完,請求指示! ");Scanner scanner = new Scanner(System.in);scanner.next();System.out.println("直接內存開始釋放! ");byteBuffer = null;System.gc();scanner.next();}}運行后內存占用情況
釋放直接內存后的內存占用情況
為什么直接內存讀取速度要由于jvm堆的內存
使用IO
讀寫文件,需要與磁盤交互,需要由用戶態切換到內核態。在內核態時,需要內存如右圖的操作。
使用IO,見下圖。這里需要兩份內存存儲重復數據,效率低。
使用NIO
使用NIO時,如右圖。操作系統劃出的直接緩存區可以被java代碼直接訪問,只有一份。NIo適合對大文件的讀寫操作。
總結
以上是生活随笔為你收集整理的JVM学习笔记之-对象的实例化,内存布局与访问定位,直接内存(Direct Memory)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JVM学习笔记之-方法区,栈、堆、方法区
- 下一篇: JVM学习笔记之-执行引擎(Execut