Android内存优化2:JVM的GC算法-分代收集算法

一:分代收集理论

分代收集建立在两个分代假说之上:
1.弱分代假说
大多数对象都是朝生夕灭
2.强分代假说
经历越多次垃圾收集过程没有被回收的对象越难消完

分代假说其实是一套符合绝大多数垃圾收集的经验法则,它在时间开销和空间开销之间找到了一个平衡点,它将JVM堆划分成不同的区域,按照年龄分配到不同区域存储,如果一个区域属于弱分代假说,每次回收只标记少量存活的对象,而不标注大量要被回收的对象。如果属于强分代假说的,把它们放在一起,JVM可以以较低的频率回收这个区域。

二:现在JVM划分

现代JVM一般把Java堆划分成新生代、老年代两个区域
新生代:
新生代中每次垃圾收集都会有大量对象清理掉,而没有清理掉的少量对象会转移到老年代中存放。
老年代:
一个对象如果在新生代没有被清理掉,转移到老年代中存放。老年代的内存大小一般比新生代大,能存放更多的对象。如果对象比较大(比如长字符串或者大数组),并且新生代的剩余空间不足,则这个大对象会直接被分配到老年代上。

三:跨引用假说

跨引用假说为解决什么问题呢?
对象不是孤立的,会存在跨代引用,新生代的对象如果被老年代的对象引用,如果要找到引用它的对象,就要遍历整个老年代中所有对象,反过来同样如此,如此会造成大量的性能开销。
跨引用假说如何实现?
新生代上建立一个全局的数据结构,这个数据结构把老年代划分成多个小块,标记老年代哪一块内存会被跨代引用,Minor GC(新生代垃圾收集)时,只有跨代引用的小块加入到GC Roots扫描,如此Minor GC清理不了时会加入到老年代中,跨代引用的问题也没有了,同时它只需要维护记录数据,不需要编译整个老年代所有对象,减少了开销。

你可能感兴趣的:(Android内存优化2:JVM的GC算法-分代收集算法)