JVM笔记(8)——直接内存
- 互联网
- 2025-08-20 01:12:01

一、什么是直接内存
直接内存不是虚拟机运行时数据区的一部分,是在运行时数据区外、直接向系统申请的内存空间。
通常,访问直接内存的速度会优于堆,读写性能更好。因此,出于性能考虑,读写频繁的场合可能会考虑使用直接内存。Java的NIO库允许Java程序使用直接内存,用于数据缓冲区。
普通IO写需要从用户缓存空间copy到内核缓存空间再copy到磁盘(读就是反过来),而NIO是直接与磁盘进行交互,因此速率更快,适合对大文件的读写操作。
二、直接内存的简单使用 1. 使用ByteBuffer.allocateDirect()方法 public static void main(String[] args) { //申请直接内存 ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1024*1024*1024); System.out.println("内存分配完毕"); Scanner scanner = new Scanner(System.in); scanner.next(); System.out.println("直接内存开始释放"); byteBuffer = null; System.gc(); scanner.next(); } 2. 使用Unsafe对象的allocateMemory()方法ByteBuffer.allocateDirect()方法内部也是通过Unsafe对象的allocateMemory()方法来分配内存的。
public static void unSafeTest() throws IllegalAccessException { //无法使用,其内部通过判别当前类加载器限制了这个方法的调用 // Unsafe unsafe = Unsafe.getUnsafe(); //通过反射构造unsafe对象 Field unsafeField = Unsafe.class.getDeclaredFields()[0]; unsafeField.setAccessible(true); Unsafe unsafe = (Unsafe)unsafeField.get(null); int count = 0; while (true) { unsafe.allocateMemory(1024*1024*1024); System.out.println(++count); } } 三、直接内存的大小设置与内存溢出直接内存可通过MaxDirectMemorySize设置,如果不指定,则默认与堆的-Xmx参数值一致。
使用时若超出最大内存则会抛出OutOfMemoryError。
四、直接内存的回收直接内存不受JVM内存管理,分配和回收成本较高。
直接内存不受gc控制,是通过虚引用和引用计数判断,gc时若发现无引用,则通知系统直接内存可以垃圾回收了,然后这里具体垃圾回收由操作系统来处理。
JVM笔记(8)——直接内存由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“JVM笔记(8)——直接内存”
上一篇
Linux常用命令
下一篇
Python3pip