JVM垃圾回收机制
主要从什么时候回收、回收哪些对象、怎么回收三个方面叙述。
参考:
什么时候进行垃圾回收
在JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫描那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。
哪些对象会被回收
- 引用计数器法:为每个对象创建一个【引用计数器】,有对象引用时计数器 +1,引用被释放时计数 -1(缺点:循环引用问题)
- 可达性分析法:从【 GC Roots 】开始向下搜索,搜索所走过的路径称为【引用链】。当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是可以被回收的。
怎么回收(回收算法)
-
标记-清除
标记可回收对象,然后清除(缺点:使得整块内存碎片化)
-
复制算法
将内存分为相等大小的两份,存活对象复制到另一份,然后清除剩下的部分。
-
标记-整理算法
存活对象移动到一端,剩下的一块清理掉
-
分代回收算法
新生代(存活率低)基本采用复制算法,老年代(存活率高)采用标记-整理或标记-清除算法
minor GC: 程序刚开始运行的时候,当eden区满了的时候,会发起一次minor GC,将eden区存活对象复制到 from 区,大部分可回收对象则被清除;但from区也会慢慢被填满,因此接下来的minor GC,会将eden和from区存活对象复制到 to 区,然后将 eden和 from区一次清理,这样就保证了to和from区总有一个是空的。
major GC:清理old区,使用标记-整理算法(将存货对象往一边移动,然后将边界的区域一次性清除)
问题:
1、什么是GC roots
GC roots是可达性分析算法中定义的一个根节点,从这个节点开始,引出下一个节点,如果下一个节点还指向有对象,就又引出一个节点,以此类推。这样从GC root对象开始引出的一条线叫引用链,当没有引用链指向的对象,就会被判定为可回收对象
2、哪些对象可以作为 GC root?
- 虚拟机栈(栈帧中的本地变量表)中引用的对象
- 本地方法栈中 JNI(即一般说的 Native 方法)引用的对象
- 方法区中类静态属性引用的对象
- 方法区中常量引用的对象
本文来自博客园,作者:aJream,转载请记得标明出处:https://www.cnblogs.com/ajream/p/16117496.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人