【java】---JVM垃圾收集器

时间:2023-01-02 08:45:58

有许多不同的命令行开关可以用于Java。

开关 描述
-Xms 设置JVM启动时的初始堆大小。
-Xmx 设置最大堆大小。
-Xmn 设置年轻一代的规模。
-Xss 设置线程大小

Serial Collector 

           串行收集器是Java SE 5和6中客户端样式机器的默认设置。通过串行收集器,Minor GC和Major GC都是串行完成的(使用单个虚拟CPU)。另外,它使用了一个mark-compact收集方法。这种方法将老年代的内存移动到堆的开始处,以便在堆的末尾将新的内存分配制作为一个连续的内存块。内存的压缩使得将新的内存块分配给堆更快。

使用案例

           串行GC是大多数应用程序的首选垃圾收集器,这些应用程序没有较低的暂停时间要求,可以在客户端样式的计算机上运行。它只利用单个虚拟处理器进行垃圾收集工作。不过,在今天的硬件上,串行GC可以用几百MB的Java堆来有效地管理很多不平凡的应用程序,并且相对较短的最坏情况下的停顿(大约几秒钟的完整垃圾收集)。

            串行GC的另一个常用用途是在同一台机器上运行大量JVM(在某些情况下,可用处理器数量多于JVM)的环境中。在这样的环境中,当JVM执行垃圾收集时,最好使用一个处理器来尽可能减少对其余JVM的干扰,即使垃圾收集可能会持续更长时间。串行GC很适合这种折衷。

         最后,随着嵌入式硬件的普及,内存很少,内核也很少,串口GC可能会卷土重来。

命令行开关

要启用串行收集器,请使用:
-XX:+UseSerialGC

这里是一个示例命令行用于启动Java2Demo
java -Xmx12m -Xms3m -Xmn1m  -XX:+UseSerialGC -jar c:\javademos\demo\jfc\Java2D\Java2demo.jar

Parallel Collector

           并行垃圾收集器使用多个线程来执行新生代的垃圾收集。默认情况下,在具有N个CPU的主机上,并行垃圾收集器在集合中使用N个垃圾收集器线程。垃圾回收器线程的数量可以通过命令行选项来控制:
-XX:ParallelGCThreads=<desired number>

            在具有单个CPU的主机上,即使并行垃圾收集器已经被请求,也使用默认的垃圾收集器。在具有两个CPU的主机上,并行垃圾回收器通常和默认的垃圾回收器一样执行,并且在具有两个以上CPU的主机上可以减少新生代垃圾回收器的暂停时间。

使用案例

              并行收集器也被称为吞吐量收集器。由于它可以使用多个CPU来加速应用程序吞吐量。当需要做很多工作并且可以接受长时间停顿时,应该使用这个收集器。例如,像打印报告或帐单或执行大量数据库查询的批处理。

-XX:+UseParallelGC

           通过这个命令行选项,你可以得到一个带有单线程旧代收集器的多线程年轻代收集器。该选项还可以实现老一代的单线程压缩。

 这里是一个示例命令行用于启动Java2Demo
java -Xmx12m -Xms3m -Xmn1m  -XX:+UseParallelGC -jar c:\javademos\demo\jfc\Java2D\Java2demo.jar

-XX:+UseParallelOldGC

             有了这个-XX:+UseParallelOldGC选项,GC既是一个多线程的新生代收集器,也是一个多线程的old 区收集器。它也是一个多线程压缩收集器。HotSpot只在老一代进行压缩。年轻一代在HotSpot被认为是一个复制; 因此,不需要压缩。

               压缩描述了物体之间没有空洞的移动物体的行为。垃圾收集扫描之后,活动对象之间可能会留下空洞。压实物体,以便没有剩下的洞。垃圾收集器可能是一个非压缩收集器。因此,平行收集器和平行压缩收集器之间的差异可以是后者在垃圾收集扫描之后压缩空间。前者不会。

         这里是一个示例命令行用于启动Java2Demo
java -Xmx12m -Xms3m -Xmn1m -XX:+UseParallelOldGC -jar c:\javademos\demo\jfc\Java2D\Java2demo.jar

CMS Collector

             并发标记扫描(CMS)收集器(也称为并发低暂停收集器)收集终身代。它试图通过与应用程序线程同时执行大部分垃圾收集工作来尽量减少由于垃圾收集造成的暂停。通常情况下,并发的低暂停收集器不会复制或压缩活动对象。垃圾收集完成时不移动活动对象。如果碎片成为问题,请分配一个更大的堆。

 注意:年轻一代的CMS收集器使用与并行收集器相同的算法。

使用案例

        CMS收集器应该用于需要较少暂停时间的应用程序,并且可以与垃圾收集器共享资源。示例包括响应事件的桌面UI应用程序,响应请求的Web服务器或响应查询的数据库。

命令行开关

要启用CMS收集器,请使用:
-XX:+UseConcMarkSweepGC
并设置线程的使用数量:
-XX:ParallelCMSThreads=<n>

这里是一个示例命令行用于启动Java2Demo
java -Xmx12m -Xms3m -Xmn1m -XX:+UseConcMarkSweepGC -XX:ParallelCMSThreads=2 -jar c:\javademos\demo\jfc\Java2D\Java2demo.jar

G1垃圾收集器

          Garbage First或G1垃圾收集器在Java 7中可用,并被设计为CMS收集器的长期替代品。G1收集器是一个并行的,并发的,逐步压缩的低暂停垃圾收集器,与前面描述的其他垃圾收集器的布局完全不同。

命令行开关

要启用G1收集器,请执行以下操作:
-XX:+UseG1GC

这里是一个示例命令行用于启动Java2Demo
java -Xmx12m -Xms3m -XX:+UseG1GC -jar c:\javademos\demo\jfc\Java2D\Java2demo.jar