找到正在运行的垃圾收集器类型

时间:2011-02-17 04:06:52

标签: java jvm

Post JSE 5人体工程学旨在为您自动选择合适类型的垃圾收集器(等等)。

我想知道是否有任何方法可以确认/了解垃圾收集器的类型和JVM人体工程学选择/当前设置的性能目标。

10 个答案:

答案 0 :(得分:59)

java -XX:+PrintCommandLineFlags -version

将显示默认的垃圾收集器。我还发现以下页面有用details the default garbage collector for various operating systems

答案 1 :(得分:15)

import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;
import java.util.List;

public class GCInformation {

    public static void main(String[] args) {
            try {
                    List<GarbageCollectorMXBean> gcMxBeans = ManagementFactory.getGarbageCollectorMXBeans();

                    for (GarbageCollectorMXBean gcMxBean : gcMxBeans) {
                            System.out.println(gcMxBean.getName());
                            System.out.println(gcMxBean.getObjectName());
                    }

            } catch (RuntimeException re) {
                    throw re;
            } catch (Exception exp) {
                    throw new RuntimeException(exp);
            }
    }
}

e.g。尝试按照以下命令了解各种GC类型

java -XX:+PrintCommandLineFlags  GCInformation
java -XX:+PrintCommandLineFlags -XX:+UseParallelGC GCInformation
java -XX:+PrintCommandLineFlags -XX:+UseConcMarkSweepGC -XX:+UseParNewGC GCInformation
java -XX:+PrintCommandLineFlags -XX:+UseConcMarkSweepGC -XX:-UseParNewGC GCInformation

答案 2 :(得分:10)

不是您问题的直接答案,但我相信这正是您所需要的。

根据 Java 6 文档12(不仅仅是Java 5):

参考1说:

  

在运行该服务器的服务器级机器上   服务器VM,垃圾收集器(GC)   已从上一个序列改变   收集器[...]到并行收集器

参考2说:

  

从J2SE 5.0开始,当   应用程序启动,启动器   可以尝试检测是否   应用程序正在运行   “服务器级”机器,如果是这样,使用   Java HotSpot Server Virtual   机器(服务器VM)而不是   Java HotSpot客户端虚拟机   (客户端VM)。

另外,参考2说:

  

注意:对于Java SE 6,定义   服务器级机器是at   至少2个CPU和至少2GB的   物理记忆。

根据这些信息,您可以知道如果该框是服务器(根据2),那么它将使用并行GC。您还可以推断它在运行时不会更改GC。

如果您深入了解文档,您可能会找到非服务器机器的正确答案。

答案 3 :(得分:6)

(对于 Java&lt; = 8

此命令打印正在运行的JVM的GC类型:

jmap -heap <pid> | grep GC

对于现代计算机(多个cpu,大内存),JVM会将其检测为服务器计算机,默认情况下使用Parallel GC,除非您明确指定通过JVM标记使用哪个gc。

e.g

jmap -heap 26806 | grep GC

输出:

  

具有8个螺纹的并行GC

@Update - 适用于Java 9 +

(感谢 @JakeRobb &#39>评论。)

自Java 9以来,有两个与此问题相关的更改:

  • 需要使用jhsdb附加到java进程或启动调试器 请参阅:jhsdb
  • 默认gc更改为G1

命令格式:

jhsdb jmap --heap --pid <pid> | grep GC

e.g

jhsdb jmap --heap --pid 17573 | grep GC

输出:

  

具有8个螺纹的垃圾优先(G1)GC

答案 4 :(得分:3)

-XX:+PrintGC
-XX:+PrintGCDetails

这将打印使用GC的内容。在我的情况下它打印:

[GC (Allocation Failure) [PSYoungGen: 348192K->32K(348672K)] 356792K->8632K(1048064K), 0.0111518 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]

这意味着并行垃圾收集器正用于年轻一代。 &#34;分配失败&#34;表示垃圾收集已启动,因为年轻代堆部分没有足够的空间。

答案 5 :(得分:1)

答案 6 :(得分:1)

以下是有关如何programmatically get GC info的一些信息,但看起来事先可能需要GC的名称。麻烦。

编辑:尝试ManagementFactory.getGarbageCollectorMXBeans()并迭代返回的列表。其中一个将是活跃的。

答案 7 :(得分:0)

您可以在JDK 14中使用以下VM参数,

-Xlog:gc -Xlog:gc*

日志将是:

[0.008s][info][gc,heap] Heap region size: 1M
[0.008s][info][gc,heap,coops] Heap address: 0x0000000700000000, size: 4096 MB, Compressed Oops mode: Zero based, Oop shift amount: 3
[0.011s][info][gc           ] Using G1
[0.011s][info][gc,cds       ] Mark closed archive regions in map: [0x00000007bff00000, 0x00000007bff7aff8]
[0.011s][info][gc,cds       ] Mark open archive regions in map: [0x00000007bfe00000, 0x00000007bfe50ff8]
[0.027s][info][gc           ] Periodic GC disabled

答案 8 :(得分:0)

要实现性能目标,您需要检查各种GC算法。

Oracle JDK中的可用收集器

-XX:+ UseSerialGC

-XX:+ UseParallelGC

-XX:+ UseG1GC

-XX:+ UseConcMarkSweepGC

-XX:UseZGC

在Java 7/8中打开GC记录

java -XX:+PrintGCDetails -XX:+PrintGCDateStamps - Xloggc: <file-path>

在Java 9及更高版本中启用GC日志记录

java –Xlog:gc*:file=<file-path>:filecount=10,filesize=10M

在Java 9及更高版本中动态打开GC日志记录

jcmd <pid> VM.log what=gc output=<file-path>

尝试使用GC日志分析工具来比较GC日志

GC日志分析器-http://www.gcloganalyzer.com

答案 9 :(得分:-3)

您可以使用-XX标记JRE来选择您选择的垃圾收集器。

Tuning Garbage Collection with the 5.0 Java TM Virtual Machine

此外,您可以使用JConsole来监控垃圾回收。