直接内存在面试中被问到还是挺多的。记得有次被问直接内存如何回收的?当时还有所准备,就回答 直接内存 属于堆外内存,不由gc直接回收,但是gc操作会触发回收操作。实际回收是由Cleaner完成,而Cleaner继承于幻引用(PhantomReference)。当时被问 由于幻引用不影响垃圾回收,有没可能Cleaner把直接内存回收了,但是直接内存的引用还有效呢,这不就有问题了么?当时心想还真是…
  显然不会出现这种情况:直接内存引用还有效的情况下,堆外内存被Cleaner偷偷的回收了。当时没能回答上来一方面是自己掌握的不够扎实,另一方面就是面试官混淆了概念把自己绕进去了。
  我们说幻引用指向不会影响对象的被回收,这个对象是指referent,而不是reference。
一个简单示意:

Object referent = new Object();
PhantomReference reference= new PhantomReference(referent, null);

  即:referent 什么时候被回收,跟reference 的引用没有关系。
  但referent 被回收收后,reference 是可以做一些事情的。这也是直接内存回收的大致逻辑。
DirectByDireteBuffer里初始化cleaner:

cleaner = Cleaner.create(this, new Deallocator(base, size, cap))

  this 是DirectByDireteBuffer。Deallocator 实现了Runnable ,run方法里面才是真正进行回收的地方。

  所以Cleaner不会在DirectByDireteBuffer 还有效的情况下提前 进行回收操作。只有DirectByDireteBuffer被判定为可回收之后才会触发 直接内存的回收操作。对于Cleaner具体细节可以搜索相关文档。
测试代码

 ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1024 *  1024 * 256);byte[] data = new byte[1024 *  1024 * 256];Arrays.fill(data, (byte)1);byteBuffer.put(data);byteBuffer = null;System.gc();Thread.sleep(1000*600);

回收时调用栈

回收前后进程内存占用情况

第一列数差值两百多M左右,跟实际分配的内存大小差不多。

Java直接内存回收相关推荐

  1. Java jvm 内存回收机制

    原文:Java jvm 内存回收机制 源代码下载地址:http://www.zuidaima.com/share/1782298898271232.htm 在Java中,它的内存管理包括两方面:内存分 ...

  2. Java的内存回收机制

    在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的,降低了Java程序员的学习难度,避免了像C/C++直接操作内存的危险.但是,也正 ...

  3. java 手动内存回收_java内存与回收调优

    要了解Java垃圾收集机制,先理解JVM内存模式是非常重要的.今天我们将会了解JVM内存的各个部分.如何监控以及垃圾收集调优. Java(JVM)内存模型 正如你从上面的图片看到的,JVM内存被分成多 ...

  4. JAVA的内存回收机制(快速入门版)

    java内存回收机制 内存回收,是JVM中垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制 引用 : java中什么是引用? Person xiaoi =new ...

  5. java加快内存回收_java内存管理之垃圾回收及JVM调优

    GC(garbage Collector 垃圾收集器) 作用:a.内存的动态分配:b.垃圾回收 注:Java所承诺的自动内存管理主要是针对对象内存的回收和对象内存的分配. 一.垃圾标记 程序计数器.J ...

  6. java怎么手动回收内存吗_java基本功16课:(4)Java的内存回收

    1.一个完整的Java程序运行过程会涉及以下内存区域: 寄存器:JVM内部虚拟寄存器,存取速度非常快,程序不可控制. 栈内存:保存局部变量的值,包括:1.用来保存基本数据类型的值:2.保存类的实例,即 ...

  7. 2.Java内存回收机制

    一.Java对象在内存引用状态 内存泄露:程序运行过程中,会不断分配内存空间,那些不再使用的内存空间应该即时回收它们,从而保证系统可以再次使用这些内存,如果存在无用的内存没有被回收回来,这就是内存泄漏 ...

  8. Java技术专题之JVM逻辑内存回收机制研究图解版

    一.引言 JVM虚拟机内存回收机曾迷惑了不少人,文本从JVM实现机制的角度揭示JVM内存回收的原理和机制. 一.Java平台逻辑架构 二.JVM物理结构 通过从JVM物理结构图我们可以看到: 1.JV ...

  9. java分析内存泄露工具_Eclipse Memory Analyzer(Java内存泄漏分析工具)

    概述 一个大型的Java项目也许从开发到测试结束并未发现一些大的问题,但是在生产环境中还是会出现一些非常棘手的问题,如内存泄漏,遇到这样的问题对于一个经验尚浅的开发人员来说难度非常大,好的一点是JVM ...

最新文章

  1. shell win10 改成cmd_修复win10系统将在此处打开命令改为CMD/Powershell的修复技巧
  2. Java线程-线程八锁
  3. Android开发之单例模式
  4. 【python数据挖掘课程】十八.线性回归及多项式回归分析四个案例分享
  5. CCNP-第一篇-思科SLA+华为BFD+ODR+浮动路由
  6. spring+mybatis+log4j 输出SQL
  7. YUY2转RGB 的各种版本
  8. 权重分析——CRITIC权重法
  9. 新装电脑能装w ndows7吗,为什么刚买的新电脑,却不支持安装Win7系统,背后的真实原因?...
  10. Ubuntu server 20.4 配置静态ip
  11. 电容篇-电容器件工作原理及参数分析理解
  12. 计算机网络期末考试代做,代做计算机作业-易指做帮写网
  13. c语言函数定义四要素,C语言函数
  14. Python处理Excel,学会这十四个方法,工作量减少大半!
  15. uniapp 滑动操作
  16. R软件做线性回归分析
  17. 决手动打开凭据管理器报0x80070005错误的问题-CMD方式
  18. 中美自动驾驶最新融资情况:千万级与十亿级美元的距离
  19. 【音乐-睡眠系列】【第一期】音乐改善睡眠质量
  20. 嵌入式存储封装技术SiP、SOC、MCP、PoP的区别

热门文章

  1. 计算LBS经纬度距离方法Haversine
  2. Android仿知乎图片墙
  3. 俄罗斯方块双人对战版
  4. c语言graphics调用gpg图片,求助:嵌入式c驱动程序,初始化gpg0和gpg9 为什么getpin时不是0...
  5. 1404:我家的门牌号
  6. 华为Taurus云原生数据库论文分析
  7. TuneUp Utilities
  8. 接口测试之接口的定义
  9. C++基础入门:实现类似暴风影音的影音播放器!(源码展示)
  10. 阿里云IoT工业互联网平台,打通工业制造上下游