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

问题描述 投票:56回答:8

Post JSE 5人体工程学旨在为您自动选择适当类型的垃圾收集器(以及其他内容)。

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

java jvm
8个回答
61
投票
java -XX:+PrintCommandLineFlags -version

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


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);
            }
    }
}

例如尝试以下命令来了解各种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

10
投票

不是你的问题的直接答案,但我相信这是你正在寻找的。

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

参考1说:

在运行服务器VM的服务器级计算机上,垃圾收集器(GC)已从先前的串行收集器[...]更改为并行收集器

参考2说:

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

另外,参考2说:

注意:对于Java SE 6,服务器级计算机的定义是具有至少2个CPU和至少2GB物理内存的计算机。

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

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


9
投票

(对于Java <= 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的评论。)

从Java 9开始,有2个与此问题相关的更改:

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

命令格式:

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

e.g

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

输出:

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


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]

这意味着并行垃圾收集器正在用于年轻一代。 “分配失败”意味着垃圾收集开始是因为年轻代堆部分没有足够的空间。


1
投票

1
投票

这里有一些关于如何使用programmatically get GC info的信息,但看起来它可能需要事先使用GC的名称。麻烦。

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


-3
投票

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

Tuning Garbage Collection with the 5.0 Java TM Virtual Machine

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

© www.soinside.com 2019 - 2024. All rights reserved.