Java Garbage Collection基础之Java 垃圾回收机制技术详(4)

并行垃圾收集器在年轻代使用多线程进行垃圾回收。默认情况下,在N个CPU的主机上,并行垃圾收集器使用N个垃圾收集器线程进行垃圾回收。垃圾收集器线程的个数可以在命令行进行设置:-XX:ParallelGCThreads=<期望的数值>

 在单核的CPU上,尽管我们请求设置的是并行垃圾收集器,但JVM还是使用默认的垃圾收集器。在两个CPU的主机上,并行垃圾收集器与默认的串行垃圾收集器所表现出来的性能相当,年轻代的垃圾收集器暂停时间与两个以上CPU的主机相比也有所减少。并行垃圾收集器有两种使用方式。

使用的算法说明:

年轻代:与串行垃圾收集器年轻代相同的拷贝算法,只不过是该算法的并行版本,使用多个CPU并行的运行,减少了垃圾收集的开销,因此增加了吞吐量。

年老代:与串行垃圾收集器老年代想听的标记-清扫-压缩(mark-sweepcompact)算法,只不过是该算法的并行版本。

示例并行收集器也叫做吞吐量收集器,因为其可以使用多个CPU来增大应用程序的吞吐量。当应用程序需要处理大量的工作同事可以接受较长的暂停时,可以使用并行垃圾收集器。例如,想打印报告或者账单这样的批处理,或者进行大量的数据库查询。

-XX:+UseParallelGC

使用这个命令行参数,就会将年轻代设置为多线程的收集器,老年代使用单线程的收集器。该选项,还会在老年代进行单线程的压缩工作。

启动示例应用程序Java2Demo的命令行如下:

java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseParallelGC -jar c:\javademos\demo\jfc\Java2D\Java2demo.jar

-XX:+UseParallelOldGC
使用该参数,年轻代和老年代都会使用多线程的收集器,同时,也使用多线程的压缩收集器。HotSpot仅仅在老年代进行整理,在年轻代是一个复制收集器,因此没必要进行整理。

压缩描述的是这样一种行为,移动对象使得个对象之间没有空闲位置。再一次垃圾收集的清理之后,存活对象在内存中的存储位置之间可能存在空闲区。整理移动对象,使得对象的存储都是顺序的,彼此之间没有空闲区。垃圾收集器可能也是一个不带压缩的收集器。所以,并行收集器和并行压缩收集器之间的区别就是后者在垃圾收集清理操作之后,对内存空间进行一次整理。

启动示例应用程序Java2Demo的命令行如下:

java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseParallelOldGC -jar c:\javademos\demo\jfc\Java2D\Java2demo.jar

3、并发标记清理收集器

并发标记清理收集器(CMS,又叫作并发低暂停收集器)在老年代进行收集。由于垃圾收集能使用应用线程的并发进行大多数的垃圾收集工作,所以它降低了应用程序的暂停时间。

正常说来,并发低暂停的收集器对存活对象不进行复制和压缩的工作。这种情况下,垃圾收集器没有移动任何存活对象。如果因此而带来了内存的碎片问题,那就为其分配一个更大的堆。

注意CMS收集器在年轻代使用和并行收集器一样的算法。

示例:CMS收集器常常应用于需要低暂停及可以与垃圾收集器共享资源的场景。例如:桌面UI应用程序对事件的响应,Web服务器对请求的响应,以及数据库对查询请求的响应。

命令行参数

 如果要使用CMS收集器,使用 -XX:+UseConcMarkSweepGC ,同时,可以设置并发的线程数目 -XX:ParallelCMSThreads=<n> 。

启动示例应用程序Java2Demo的命令行如下:

java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseConcMarkSweepGC -XX:ParallelCMSThreads=2 -jar c:\javademos\demo\jfc\Java2D\Java2demo.jar


4、G1 垃圾回收器

在Java 7中可以使用G1垃圾回收器,它设计的初衷是用于长期取代CMS收集器。G1垃圾收集器是一个并行、并发,同时也是基于增量整理的低暂停垃圾收集器。与前面所描述的垃圾收集器相比,从布局方面与它们有很大的不同。但本文不对该部分做详细的说明,有兴趣可以参考具体的文献资料。

命令行参数:

 如果要使用CMS收集器,使用 -XX:+UseG1GC

启动示例应用程序Java2Demo的命令行如下:

java -Xmx12m -Xms3m -XX:+UseG1GC -jar c:\javademos\demo\jfc\Java2D\Java2demo.jar

六、总结

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/8668d26b54d043e4fe56c41457388ab1.html