如何设置JVM使用的垃圾收集器及各种垃圾回收器采用的算法
一、垃圾收集器的种类
1. Serial 收集器:历史最悠久,单线程工作,回收垃圾时,必须暂停所有其它线程——stop the world,采用复制算法;
2. ParNew收集器:本质为Serial收集器的多线程版本,采用复制算法;
3. Parallel scavenge:具备自使用调节功能,以提供最合适的暂停时间和吞吐量,采用复制算法;
4. Serial old 收集器:是Serial 收集器的老年代版本,同样为单线程,但采用的是“标记-整理”算法;
5. Parallel old 收集器:Parallel scavenge 收集器的老年代版本,多线程,采用的是“标记-整理”算法;
6. CMS 收集器:即Concurrent Mark Sweep收集器,以获取最短停顿时间为目标,采用“标记-清除”算法;
7. G1 收集器:即Garbage-First收集器,是目前最新的收集器,采用与其它收集器完全不通的设计思想,历时十年才实现商用,采用了混合算法,兼有“复制”和“标记-整理”算法的特点;
二、垃圾收集器的选择
JVM中,青年代和老年代特点迥异,青年代中对象“朝生夕死”的特点,回收频率较高,适合采用复制算法;而老年代则更适合“标记-整理”算法。鉴于此,JVM采用分代回收的策略:青年代采用复制算法的回收器,老年代采用“标记-整理”算法的回收器。
三、设置垃圾收集器参数
-XX:+UseSerialGC,虚拟机运行在Client模式下的默认值,Serial+Serial Old。
-XX:+UseParNewGC,ParNew+Serial Old,在JDK1.8被废弃,在JDK1.7还可以使用。
-XX:+UseConcMarkSweepGC,ParNew+CMS+Serial Old。
-XX:+UseParallelGC,虚拟机运行在Server模式下的默认值,Parallel Scavenge+Serial Old(PS Mark Sweep)。
-XX:+UseParallelOldGC,Parallel Scavenge+Parallel Old。
-XX:+UseG1GC,G1+G1。
四、测试代码:
public static void main(String[] args)
{
/* -XX:+UseParallelOldGC和-XX:+UseParallelGC结果一样,因为MXBean名字一样,但是实际使用的不一样 */
List<GarbageCollectorMXBean> beans = ManagementFactory.getGarbageCollectorMXBeans();
for (GarbageCollectorMXBean bean : beans)
{
System.out.println(bean.getName());
}
}
1、测试环境:
JDK1.8.0_144,Java HotSpot(TM) 64-Bit Server VM,
默认参数:-XX:+PrintGCDetails -XX:+PrintCommandLineFlags
打印内存信息,打印JVM参数
2、测试结果:指定-XX:+UseParallelGC
PS MarkSweep
Heap
PSYoungGen total 38400K, used 2662K [0x00000000fd580000, 0x0000000100000000, 0x0000000100000000)
eden space 33280K, 8% used [0x00000000fd580000,0x00000000fd819be8,0x00000000ff600000)
from space 5120K, 0% used [0x00000000ffb00000,0x00000000ffb00000,0x0000000100000000)
to space 5120K, 0% used [0x00000000ff600000,0x00000000ff600000,0x00000000ffb00000)
ParOldGen total 87552K, used 0K [0x00000000f8000000, 0x00000000fd580000, 0x00000000fd580000)
object space 87552K, 0% used [0x00000000f8000000,0x00000000f8000000,0x00000000fd580000)
Metaspace used 2651K, capacity 4486K, committed 4864K, reserved 1056768K
class space used 293K, capacity 386K, committed 512K, reserved 1048576K