JVM垃圾收集算法笔记

      商用HotSpot虚拟机将堆内存分为年轻代和老年代。年轻代又可细分为Eden区和From survivor区和To survivor区。Eden和survivor默认使用8:1比例。

       常用收集算法:

        1. 标记--清除算法:分为“标记”、“清除”两个阶段。先标记所有需要回收的对象,标记完成后统一清除被标记的对象。标记、清除两个阶段的效率都不高,且会产生大量的不连续的内存碎片。所以实际中很少使用,但它是所有其它垃圾收集算法的基础,其它算法都是在此基础上进行优化。

        2. 复制算法:将内存分为两块,每次只使用其中一块,垃圾回收时将所有不需要回收对象复制到另一块内存,然后将本块内存全部清除。缺点是浪费一半的内存。研究表明,98%以上的对象是“朝生夕死”,所以HotSport在实现时将内存分为Eden和两块survivor(Eden与Survivor默认比例8:1),每次使用Eden和其中一块survivor,这样只浪费了10%的内存。98%的对象可回收只是 一般场景下的数据,我们没有办法保证每次回收都只有少于10%的对象存活,当survivor内存不足时需要老年代进行分配担保。

        3. 标记--整理算法:分为“标记”、“整理”两个阶段,先标记所有需要回收的对象,标记完成后将所有存活对象向一段移动,然后直接清理掉段边界以外的内存。

        HotSpot垃圾收集时使用分代收集算法,即年轻代和年老代使用不能的收集算法。年轻代使用复制算法 ,老年代使用标记--整理算法。

 

         如何判断一个对象需要被回收?

         1. 引用计数法:对象被引用加1,去引用减1,这样只需要判断对象的引用计数器是否为0就可以,但无法解决循环引用问题。

         2. 可达性分析算法:以一系列的“GC ROOTS”的对象为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC ROOTS没有任何引用链时,则证明这个对象是不可用的。

你可能感兴趣的:(java)