@chenxuxiong
2016-05-27T09:04:30.000000Z
字数 2556
阅读 482
JAVA虚拟机
有复制算法,标记整理,标记清除和分代收集算法
为了提高效率
对堆进行分区,不同分区采用不同的回收算法,其实就是分代收集算法
为了减少回收频率,堆被划分为新生代,老年代和永久代
又可细分为(新生代)eden,survior from,to;老年代 Tenured;永久代Perm
其中比例默认为8:1:1
基于回收次数的不同,新生代采用复制算法,老年代采用标记整理算法。
1. 标记-清除(Mark-Sweep)
第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。它需要暂停整个应用,也会产生内存碎片。
2. 复制(Copying)
把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用对象复制到另外一个区域中。每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去后会进行内存整理,不过出现“碎片”问题。缺点也是很明显的,就是需要两倍内存空间。
3. 标记-整理(Mark-Compact)
此算法结合了 “标记-清除”和“复制”两个算法的优点。也是分两阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,把清除未标记对象并且把存活对象 “压缩”到堆的其中一块,按顺序排放。此算法避免了“标记-清除”的碎片问题,同时也避免了“复制”算法的空间问题。
1.新生代 GC(Minor GC):指发生在新生代的垃圾收集动作,因为 Java 对象大多都具备朝生夕灭的特性,所以 Minor GC 非常频繁,一般回收速度也比较快。一般用的是复制算法
2.老年代 GC(Major GC / Full GC):指发生在老年代的 GC,出现了 Full GC,经常
会伴随至少一次的 Minor GC(但非绝对的,在 ParallelScavenge 收集器的收集策略里
就有直接进行 Major GC 的策略选择过程) 。Full GC 的速度一般会比 Minor GC 慢 10倍以上。一般用的是标记整理和标记清除算法
3.Parallel Scavenge(并行回收GC)收集器
Parallel Scavenge收集器也是一个新生代收集器,它也是使用复制算法的收集器,又是并行多线程收集器
CMS等收集器的关注点是尽可能地缩短垃圾收集时用户线程的停顿时间,而parallel Scavenge收集器的目标则是达到一个可控制的吞吐量。吞吐量= 程序运行时间/(程序运行时间 + 垃圾收集时间),虚拟机总共运行了100分钟。其中垃圾收集花掉1分钟,那吞吐量就是99%。(代价:短时间内提高GC次数)
4.Serial Old(串行GC)收集器
Serial Old是Serial收集器的老年代版本,它同样使用一个单线程执行收集,使用“标记-整理”算法。
对象优先分配在Eden。大对象进入老年代。长期存活的对象进入老年代,动态对象年龄判定,空间份额担保