Java@java程序员之路——jvm详细解释(7)


Java@java程序员之路——jvm详细解释(7)
文章图片
Java@java程序员之路——jvm详细解释(7)
每天记录一个知识点
1.5 直接内存

  • 常见于NIO操作时 , 用于数据缓冲区
  • 分配成本比较高 , 读写操作快
  • 不受JVM内存回收管理
  • 使用前:从下面可以看出java内存中和系统内存中都保存了磁盘文件 。 保存了两份
    • 因为java无法操作本地文件 , 在java堆内存中划出java缓冲区;
    • 从用户态转移到内核态 , 本地方法在系统内存中划出一段系统缓冲区 , 将磁盘文件分部分缓冲到系统缓冲区中 , 间接的将系统缓冲区中数据传输到java缓冲区中;
    • 内核态转到用户态 , 调用输出流写入操作 , 将文件copy到另一个位置 , 循环copy , 直到全部复制完成 。

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

  • 疑问:直接内存不受JVM的垃圾回收机制 , 会不会出现内存泄漏那?
    答案:会的
  • package
  • com.example.jvm;importjava.nio.ByteBuffer;
  • importjava.util.ArrayList;i
  • mportjava.util.List;
  • publicclassDemo3{
  • publicstaticvoidmain(String[
    args){
  • List<ByteBuffer>list=newArrayList<>();
  • 【Java@java程序员之路——jvm详细解释(7)】inti=0;
  • try{
  • while(true){
  • ByteBuffer byteBuffer=ByteBuffer.allocateDirect(100*1024*1024);
  • list.add(byteBuffer);
  • i++;
  • finally{
  • System.out.println(i);

  • 363.6GException in thread\"main\"java.lang.OutOfMemoryError:Direct buffer memory\tat java.nio.Bits.reserveMemory(Bits.java:694)at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123)at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311)at com.example.jvm.Demo3.main(Demo3.java:14)


    推荐阅读