常见jvm垃圾回收算法解读
1、为什么要进行垃圾收集
受当前物理机器硬件发展的限制,java程序能够使用的内存是有上限的。如果没有垃圾回收这一机制,java程序运行过程中不断的创建对象,内存的使用必然是持续上涨。最终出现内存不足。
java虚拟机内置垃圾回收一来解决了垃圾回收这一复杂问题的重复开发问题,提高开发效率;再者保护了java程序的完整性。避免了程序员失误而引起的程序崩溃。
缺点是程序员失去了对java程序主动垃圾回收的控制权
2、垃圾收集算法
垃圾回收算法必须要做的两件事。检测和回收
区分垃圾和活动对象的两个方法引用计数和跟踪
3、引用计数收集器
对象创建的时候,该对象的引用计算被设置为1。新的的对象被赋值为这个对象的时候,计数加一,值被赋值为新的对象的时候,计算减1。计数为0的对象判定为垃圾。优点是运行周期短,缺点是无法检测循环引用的场景以及增加了额外的开销
4、跟踪收集器
追踪过程中为遇到的对象打上标记,标记可存在对象本身,也可以是独立的标记位图。追踪结束,未打上标记的对象判定为垃圾。
5、压缩收集器
将内存中的活动对象进行整理移动到内存的一端这个过程需要更新原始的对象的引用,不过可以通过嫁接一个对象引用层来简化工作。对象不是直接引用,而是通过对象引用层来寻址映射的,这样的话只需改变对象引用层的句柄内容就好了。
6、拷贝收集器
内存被划分为大小相同的两部分,始终有一端是空闲的,当其中的一端慢慢的内存被消耗殆尽,触发垃圾回收,将满的一端的活动对象进行整理,移动到另一空白区,然后释放原始的内存区。然后周而复始。
缺点是需要两倍的内存区。每次需要来回拷贝生命周期比较长的对象。
7、按代收集的收集器
内存区被划分为几个区域,对象的创建默认在年轻代中,经过几次垃圾回收依然存活的对象会被移动到下个代中
8、自适应收集器
根据不同的情况自动调整不同的垃圾算法。在不同的代中使用不同的算法
9、火车算法
火车算法最大的好处是它可以保证大的循环结构可以被完全收集,因为成为垃圾的循环结构中的对象,无论多大,都会被移入同一列火车,最终一起被收集。还有一个好处是这种算法在大多数情况下可以保证一次垃圾收集所耗时间在一定限度之内,因为一次垃圾回收只收集一个车厢,而车厢的大小是有限度的。