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,非必要不要执行这个命令。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)