JVM系统自学笔记3--直接内存

一、介绍
常见于NIO操作中,用于数据缓冲
分配回收成本高,但读写能力强
不受JVM内存回收管理
二、直接内存使用前和使用后
1、不使用直接内存
在这里插入图片描述

  • 因为java无法操作本地文件,在java堆内存中划出java缓冲区;
  • 从用户态转移到内核态,本地方法在系统内存中划出一段系统缓冲区,将磁 盘文件分部分缓冲到系统缓冲区中,间接的将系统缓冲区中数据传输到java缓冲区中;
  • 内核态转到用户态,调用输出流写入操作,将文件copy到另一个位置,循环copy,直到全部复制完成。

2、使用直接内存
在这里插入图片描述

  • ByteBuffer.allocateDirect(_size),在系统内存中分配直接内存;
  • 系统方法和java方法都可以访问直接内存;
  • 与不使用直接内存相比,减少了一次从系统缓存区向java缓冲区复制的操作,复制效率成倍上升。

三、分配和回收原理
使用Unsafe对象实现直接内存的分配回收,回收主要使用的是freeMemory方法
ByteBuffer类内部,使用了Cleaner(虚引用)来检测ByteBuffer对象,一旦对象被回收,就会由ReferenceHandler线程通过Cleaner的clean对象调用freeMenory来释放直接内存。
-XX:+DisableExplicitGC 显式的System.gc()显式的垃圾回收 FULL GC,被禁用。
因为考虑到系统性能,FULL GC时间够长,会严重影响性能。所以涉及到直接内存的使用,释放内存使用Unsafe.freeMemory,不建议使用System.gc()。

发布了171 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/QilanAllen/article/details/105583159