1 GC中的复制算法
将活着的内存空间分为两块,每次只用其中的一块,垃圾回收的时候根据可达性分析算法将正在使用的对象复制到另一个分块,等复制结束后,将整个内存分块回收。
- 如果内存中很多垃圾对象,这种回收方式效率很高,因为每次需要复制到另外一块内存的对象很少。
- 这种回收方式复制的过程中保证了内存使用的连续性,不会存在"碎片化"。
- 但是如果要实现这种回收方式内存就得加倍,而且如果每次回收都有很多对象需要复制就会造成效率的降低。
2 GC中的标记算法
2.1 GC中的标记-整理算法
先对可达对象进行标记,将所有不可回收的对象的移动到另外一端,然后清理掉边界外的内存。
2.2 GC中的标记-清除算法
先对可达对象进行标记,之后再遍历对可回收对象进行回收。
2.3 清除算法与整理算法
- 两种算法的区别就是是否有移动对象。
- 整理算法时如果有大量不可回收的对象,就需要通过增加移动操作并且大量修改移动对象之后的引用地址,这会带来效率的降低。但是如果采用标记清除算法,不对对象进行移动,势必会造成大量的内存碎片化的问题,只能使用复杂的内存管理分配器,为之后的对象提供存储和访问,造成程序的IO的下降。
- JDK8中的老生代GC垃圾回收器使用的是Parallel Old 采用的是标记整理算法,由于在GC时会触发STW,造成程序响应时间变长,但是提高了后续的程序吞吐量,JDK8中还存在CMS垃圾回收器是采用标记清除算法,提高了程序的响应时间,却降低了程序的吞吐量。