一、垃圾回收算法
复制算法
把内存区域分成两块,每次使用一块,进行垃圾回收的时候,将未被标记的内容复制到另一块中,原始内存中的对象就可以回收了。
优点:避免内存碎片
缺点:浪费内存
标记-清除算法
首先需要标记出所有需要回收的对象,在标记完成后,统一回收掉被标记的对象。标记过程就是对象是否属于垃圾的判定过程
缺点:
1、执行效率不稳定:如果Java堆中包含大量对象,而且其中大部分是需要被回收的,这是必须进行大量标记和清除的动作,导致标记和清除两个过程的执行效率都随对象数量增长而降低。
2、内存空间的碎片化问题:标记、清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致在程序运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。
标记-整理算法
标记过程与"标记-清除算法"一样,但后续步骤不是直接对可回收内存对象进行清理,而是让所有存活对象都想内存空间一端移动,然后清理掉边界以外的内存。
主要是为解决标记-清除算法的内存空间碎片化的问题。
二、Java堆的空间划分
新生代
eden:
survivor from:
survivor to:
老年代
老年代里面的对象几乎个个都是在 Survivor 区域中熬过来的,它们是不会那么容易就“死掉”了的。因此,Full GC 发生的次数不会有 Minor GC 那么频繁,并且做一次 Full GC 要比进行一次 Minor GC 的时间更长。 另外,标记-清除算法收集垃圾的时候会产生许多的内存碎片 ( 即不连续的内存空间 ),此后需要为较大的对象分配内存空间时,若无法找到足够的连续的内存空间,就会提前触发一次 GC 的收集动作。
三、垃圾收集器
serial收集器(复制算法):
新生代单线程收集器,标记和清除都是单线程,优点是简单高效
serial old收集器(标记-整理算法):
老年代单线程收集器,serial收集器的老年代版本。
parnew收集器(复制算法):
新生代并行收集器,实际上是serial收集器的多线程版本,在多核CPU环境下有着比serial更好的表现。
Parallel Scavenge收集器 (复制算法):
新生代并行收集器,追求高吞吐量,高效利用 CPU。
高吞吐量可以高效率的利用CPU时间,尽快完成程序的运算任务,适合后台应用等对交互响应要求不高的场景。
吞吐量 = 用户线程时间/(用户线程时间+GC线程时间)
Parallel Old收集器 (标记-整理算法):
老年代并行收集器,吞吐量优先,Parallel Scavenge收集器的老年代版本;
CMS(Concurrent Mark Sweep)收集器(标记-清除算法):
老年代并行收集器,以获取最短回收停顿时间为目标的收集器,具有高并发、低停顿的特点,追求最短GC回收停顿时间。
G1(Garbage First)收集器 (标记-整理算法):
Java堆并行收集器,G1收集器是JDK1.7提供的一个新收集器,G1收集器基于“标记-整理”算法实现,也就是说不会产生内存碎片。此外,G1收集器不同于之前的收集器的一个重要特点是:G1回收的范围是整个Java堆(包括新生代,老年代),而前六种收集器回收的范围仅限于新生代或老年代。