vlambda博客
学习文章列表

如何设置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。

四、测试代码:


  
    
    
  
  1. public static void main(String[] args)

  2. {

  3. /* -XX:+UseParallelOldGC和-XX:+UseParallelGC结果一样,因为MXBean名字一样,但是实际使用的不一样 */



  4. List<GarbageCollectorMXBean> beans = ManagementFactory.getGarbageCollectorMXBeans();

  5. for (GarbageCollectorMXBean bean : beans)

  6. {

  7. System.out.println(bean.getName());

  8. }

  9. }

1、测试环境:

JDK1.8.0_144,Java HotSpot(TM) 64-Bit Server VM,

默认参数:-XX:+PrintGCDetails  -XX:+PrintCommandLineFlags

打印内存信息,打印JVM参数

2、测试结果:指定-XX:+UseParallelGC


  
    
    
  
  1. PS MarkSweep

  2. Heap

  3. PSYoungGen total 38400K, used 2662K [0x00000000fd580000, 0x0000000100000000, 0x0000000100000000)




  4. eden space 33280K, 8% used [0x00000000fd580000,0x00000000fd819be8,0x00000000ff600000)

  5. from space 5120K, 0% used [0x00000000ffb00000,0x00000000ffb00000,0x0000000100000000)

  6. to space 5120K, 0% used [0x00000000ff600000,0x00000000ff600000,0x00000000ffb00000)

  7. ParOldGen total 87552K, used 0K [0x00000000f8000000, 0x00000000fd580000, 0x00000000fd580000)

  8. object space 87552K, 0% used [0x00000000f8000000,0x00000000f8000000,0x00000000fd580000)

  9. Metaspace used 2651K, capacity 4486K, committed 4864K, reserved 1056768K

  10. class space used 293K, capacity 386K, committed 512K, reserved 1048576K