1. Ungar GC(分成两代):
新生代: GC 复制算法;
老年代: 对整个老年代空间执行GC标记-清除算法.
2. 多代GC:
【综合来看,少设置一些分代能得到更优秀的吞度量,据说分为2或3代是最好的】
2. Train GC:
新生代: GC 复制算法;
老年代: 对单个车厢(将老年代划分成固定大小的车厢)执行GC复制算法。
Train GC:
前提: 分配的对象都是比车厢小的。
优化ungar的分代垃圾回收算法,Richard L.Hudson和S. Eliot B. Moss发明了Train GC,即列车垃圾回收算法。同样的,Train GC也是将堆内存空间空间划分了新生代和老年代,对于老年代,
Train GC将老年代空间按照一定大小,划分并按顺序连接(编了号)成一块块的小空间
,有点类似于互相连接在一起的车厢。
各量列车和车厢分别有记录集记录了其
连接关系
。
当执行新生代GC并有对象需要晋升到老年代空间时,需要将晋升的对象安排在已有的车厢或新的车厢内。在执行老年代GC时,开头列车的
开头车厢
【所以当前车厢的引用和被引用对象都在后面车厢或根,不会有前车】是GC的对象,这里会将该车厢内的几类内存数据做如下操作:
1. 根引用的数据放到一个新的车厢内;
2. 其它车厢引用到的数据复制过去[
原则:将要复制的对象跟发出引用的对象安排在同一辆列车里
]。
最后,回收这节车厢。
关于Ungar和Train GC的比较:
1. Ungar GC老年代的标记清除算法,增加了对象引用关系修改的时间,即停留时间[将整个老年代作为GC对象];
2. Train GC每一次老年代GC,仅仅回收很小的一部分[即一个车厢],可以缩短停留时间。
3. 一旦分配的内存大于车厢的大小,可能就要对这块数据不再使用车厢的算法。
这是 一年多前整理的,当时没发,躺在草稿箱一年了~~~~