总结:

  • 使用了 Unsafe 对象完成直接内存的分配回收,并且回收需要主动调用 freeMemory
  • 方法ByteBuffer 的实现类内部,使用了 Cleaner (虚引用)来监测 ByteBuffer 对象,一旦 ByteBuffer 对象被垃圾回收,那么就会由 ReferenceHandler 线程通过 Cleaner 的 clean 方法调用 freeMemory 来释放直接内存

解释:

我们先看一个使用直接内存的案例

public class Demo1_26 {static int _1Gb = 1024 * 1024 * 1024;/** -XX:+DisableExplicitGC 显式的*/public static void main(String[] args) throws IOException {ByteBuffer byteBuffer = ByteBuffer.allocateDirect(_1Gb);System.out.println("分配完毕...");System.in.read();System.out.println("开始释放...");byteBuffer = null;System.gc(); // 显式的垃圾回收,Full GCSystem.in.read();}
}

接着,我们进如allocateDirect中可以看到,此时新创建了一个DirectByteBuffer子类来存储

继续跟进,我们可以发现DirectByteBuffer是通过unsafe来开辟内存的,而unsafe就是回收直接内存的关键,至于原因,可以往下接着看

在倒数第二行,可以看到一个Cleaner类对象,这是一个虚拟引用对象,其用处是绑定当前类this对象和new对象,当this对象被gc垃圾回收后,便会自动调用虚拟引用对象的clean方法,而clean方法会执行任务对象的run方法

通过更进可以发现,这个new出来的对象就是用来回收内存的,结合上文,不难得出,unsafe便是回收和开辟内存的关键

java jvm之直接内存释放过程相关推荐

  1. Java Jvm虚拟机的内存模型概述 《对Java的分析总结》(一)

    <对Java的分析总结>-Java虚拟机的内存模型 ** 你可能需要 CSDN 网易云课堂教程 掘金 EDU学院教程 知乎 Flutter系列文章 头条同步 百度同步 本文章首发于微信公众 ...

  2. .NET中的内存管理,GC机制,内存释放过程

    引言:作为一个.NET程序员,我们知道托管代码的内存管理是自动的..NET可以保证我们的托管程序在结束时全部释放,这为我们编程人员省去了不少麻烦,我们可以连想都不想怎么去管理内存,反正.NET自己会保 ...

  3. java 方法执行结束局部变量释放_JAVA-方法在执行过程中,JVM的内存分配和变化情况,栈(stack)的情况浅析...

    方法在执行过程中,在JVM中的内存是如何分配的?内存是如何变化的? 一.方法只定义不调用,是不会被执行的,并且在JVM中也不会给该方法分配"运行所属"的内存空间.只有在调用这个方法 ...

  4. java内存分配空间大小,JVM内存模型及内存分配过程

    一.JVM内存模型 JVM主要管理两种类型内存:堆(Heap)和非堆(Permanent区域). 1.Heap是运行时数据区域,所有类实例和数组的内存均从此处分配.Heap区分两大块,一块是 Youn ...

  5. java一个接口执行结束释放内存_java的灵魂--JVM虚拟机

    JVM是运行在操作系统之上的,它与硬件没有直接的交互 JVM体系结构 1.类加载器 负责加载class文件,class文件在文件开头有特定的文件标示, 并且ClassLoader只负责class文件的 ...

  6. 三年Java开发,你连基础的JVM运行时内存布局都忘了

    面:为什么要使用双亲委派机制去加载类? 答:避免多份同样字节码的加载,浪费内存. 类的加载方式 隐式加载:new 显示加载:loadClass.forName等 类的装载过程如下图: 面:loadCl ...

  7. JAVA内存释放机制

    和内存释放(主要是GC)有关的话题. ★JVM的内存? 在Java虚拟机规范中(具体章节请看"这里 "),提及了如下几种类型的内存空间: ◇栈内存(Stack):每个线程私有的. ...

  8. java jvm内存模型_Java(JVM)内存模型– Java中的内存管理

    java jvm内存模型 Understanding JVM Memory Model, Java Memory Management are very important if you want t ...

  9. Java JVM内存模型(运行时数据区域)详解

    详细介绍了JVM运行时数据区域,包括方法区.堆空间.栈空间.本地方法栈.程序计数器.常量池.直接内存.字面量.符号引用.直接引用. Java程序在运行时,需要在内存中的分配空间.为了提高运算效率,ja ...

最新文章

  1. Linux常用的(个人用)
  2. SpingBoot+Mybaits+Vue,更新学习
  3. 随想录(回乡的若干小事)
  4. 新手先学java还是python_2018年,初学者学Java还是Python?统计数据给你答案
  5. Mac系统下安装Port
  6. Linux下安装vim编辑器
  7. js/vue两张图片合成一张画布
  8. 线程中常用的锁,有哪几种?
  9. mindspore比pytorch快?是的
  10. 智能家居十大必备功能 乐享真正智能生活
  11. FLStudio21中文版本全部新功能讲解
  12. Linux——开发工具
  13. 鸿蒙和iqoo系统谁强,鸿蒙系统发布会,小米11降500,iQOO、酷派、魅族、惠普发布新品...
  14. C++小知识——VS2013 MFC基于对话框编程
  15. php正则表达式判断三个数字相等相同|判断豹子
  16. 1.PostgreSQL下载安装
  17. 每一步详细介绍—在HM中进行CU PU TU划分以及PU最佳预测模式选择
  18. 功能测试中遇到不可重现软件缺陷的解决策略
  19. 微软模拟飞行2020服务器多少内存,《微软模拟飞行》2020配置要求 最低什么配置可以玩...
  20. 丰田工机PLC,丰田TOYOPUC通讯组态王,实例教程,组态王通讯

热门文章

  1. python全栈开发—函数整理(最后一次整理,不能再全了)
  2. Git快速入门(Win版+IDEA+Gitee实战)【基于狂神讲解】
  3. 条件logistic回归及R实现
  4. 都说「三观不正」,那么正确的三观是怎样的 [转]
  5. 微信小程序人脸识别的实现
  6. 花生壳免费实现Linux主机的内网穿透,可通过SSH、SCP远程访问
  7. Github获星99k的Java面试八股文,最全秋招面试攻略
  8. C# log4net 日志输出超详细
  9. 轻松制作组织结构图,工具模板全含
  10. 目标检测论文综述(三)One-Stage(YOLO系列)