JVM垃圾回收机制

判断一个对象是否存活的方法:

(1)引用计数法:给每个对象设置一个引用计数器,对象被引用时就+1,引用失效时就-1,当对象的引用为0时,该对象就被视为垃圾对象,等待垃圾回收。但是该方法不能解决循环引用问题。例如:A引用B,B应用A。现在的虚拟机一般不用这种方法。

(2)可达性分析法:沿着GC Roots对象(根对象)的引用链向下搜索,能找到的则为存活对象,不能找到的则为垃圾对象。

可以作为GC Roots对象的有以下几种:

(1)虚拟机中引用的对象。

(2)方法区类静态属性引用的变量。

(3)方法区常量池引用的对象。

(4)本地方法栈JNI引用的对象。

垃圾回收算法:

(1)标记清除:会产生内存碎片,现在基本不用这种算法。

(2)标记复制:不会产生内存碎片,新生代GC用这种算法。

(3)标记整理:不会产生内存碎片,老年代GC用这种算法。

(4)分代回收:java虚拟机一般将内存分成新生代和老生代,在新生代中,有大量对象死去和少量对象存活,所以采用复制算法,只需要付出少量存活对象的复制成本就可以完成收集;老年代中因为对象的存活率极高,没有额外的空间对他进行分配担保,所以采用标记清理或者标记整理算法进行回收。

 触发Full GC的条件:

(1)通过Minor GC进入老年代的对象大小大于老年代的可用内存。

(2)执行System.gc命令时,系统建议触发Full GC,非必要不要执行这个命令。

posted @   程序员_YHB  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示