世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。
- 分代收集理论
分代收集理论:
(1)绝大多数对象都是朝生夕死的
(2)熬过垃圾收集次数越多的对象越不容易消亡
(3)跨代引用相对于同代引用仅占极少数 - 垃圾收集算法都有哪些?
收集算法:
(1)标记清除:标记要清除的对象,然后清除
缺点:会产生内存碎片;当要清除的对象占多数时,效率低。
(2)标记复制:
分成两个大小相同的内存空间,一个空间用来使用,标记存活的对象,当这个空间被占满时,将标记的对象复制到另一个空间,然后将这个空间整体清除。
缺点:占用空间大;存活的对象多时效率低;
但是适合新生代收集,因为新生代每次垃圾收集存活的对象都是相对较少的,平均2%。并且在实际中,存储被复制的存活对象的空间并不需要和原空间一样大。在Hotspot中,新生代被分为Eden、Servivor1、Servivor2,比例:Eden:Servivor = 8:1,一般Eden和Servivor1用来存对象,Servivor2用来接收复制的对象,所以空间使用率90%,同时,有老年代做担保,如果存活的对象大于Servivor2的空间,可以存放到老年代中。
(3)标记整理
首先标记清除,然后将使用过的内存的空间移动到一起,以避免空间碎片化。 - 常见垃圾收集器使用的算法
根据分代收集理论,一般新生代采用标记复制的算法,老年代采用标记整理的算法。如:
新生代的serial、parNew、parellel scavenge采用标记复制算法。
老年代的serial old、parellel old采用标记整理算法。
当然也有特殊的,老年代的CMS采用的是标记清除算法。
至于G1收集器,也是采用的分代收集,但是它的新生代与老年代的区域的位置与数量并不固定,而是基于region的按局部区域划分和进行垃圾收集的。