Java-垃圾回收机制

今天读了1篇关于Java垃圾回收机制的文章,特记此以总结,有问题的地方,欢迎评论区讨论。

1 JVM如何确定需要回收那些对象?
2 JVM在什么时候进行垃圾回收?
3 JVM如何进行垃圾回收?

一、JVM如何确定那些对象需要进行回收?
判断对象回收的两个经典算法:引用计数法、可达性分析算法

1 引用计数法
(1)概括:判断对象的引用数量
(2)实现方式:为每个对象添加一个引用计数器,当其它对象引用对象A时,对象A的引用计数器+1,当引用失效时(不再执行对象A),对象A的引用计数器-1,当对象A的引用计数器=0时,通常意味着对象A是一个失效对象,会被GC(垃圾回收器)回收。
(3)缺点:存在对象之间循环引用的问题

2 可达性分析算法
(1)概括:判断对象的引用链是否可达进而决定对象是否可以被回收
(2)实现方式:把所有的引用关系看作一张图,以GC Roots(由堆外指向堆内的引用)对象为起始点,从这些节点向下搜索,搜索所经过的路径称为引用链,当一个对象与GC Roots之间没有引用链相连接,则认为该对象可以被回收
(3)图示如下:
Java-垃圾回收机制
二、JVM在什么时候进行垃圾回收?

1 在cpu空闲的时候进行自动回收
2 在堆内存存储满了之后进行回收
3 主动调用System.gc()后尝试进行回收

三、JVM如何进行垃圾回收?
垃圾收集的算法:标记-清除算法、复制算法、标记-整理算法、分代收集算法

1 标记-清除算法
(1)概括:先将需要回收的对象进行标记,最后统一回收所有标记的对象
(2)优点:简单
(3)缺点:标记清除之后产生大量不连续的碎片
(4)图示如下:
Java-垃圾回收机制
2 复制算法
(1)概括:将可用内存按照容量分为等大两个,每次只使用一个,回收时将存活对象复制到另一个,然后清除当前这个
(2)优点:不存在内存碎片
(3)缺点:使用内存仅为原来一半
(4)图示如下:
Java-垃圾回收机制
3 标记-整理算法
(1)概括:与标记-清除算法类似,只是不仅处理可回收对象,同样对存活对象进行整理
(2)优点:不产生内存碎片
(3)缺点:整理阶段,由于移动了可用对象,需要去更新引用
(4)图示如下:
Java-垃圾回收机制
4 分代收集算法
(1)概述:在具体的场景自动选择标记-清除算法、复制算法、标记-整理算法三种算法进行垃圾对象回收
(2)场景
新生代:生命周期短暂的对象(例如:方法的局部变量等)
老年代:生命周期较长的对象(例如:缓存对象、单例对象等)
永久代:生命周期无尽的对象(例如:加载过的类信息)
(3)总结
1、在新生代,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法(只需要付出少量存活对象的复制成本就可以完成收集)
2、在老年代,因为对象存活率高,没有额外空间对他进行分配担保,就必须用标记-清除算法或者标记-整理算法
(4)备注
1、在jdk8的时候java废弃了永久代,提供了与永久代类似的叫做“元空间”(元空间的本质和永久代类似)的技术。
2、废弃永久代的原因:由于永久代内存经常不够用或发生内存泄露,爆出异常java.lang.OutOfMemoryErroy。
3、元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存,也就是不局限于JVM可以使用的系统内存,理论上取决于32位/64位系统可虚拟的内存大小。

5 总结图示
Java-垃圾回收机制
参考博文链接:https://blog.csdn.net/weixin_39067991/article/details/81045201