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

Rya*_*des 59 java jvm

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

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

小智 66

java -XX:+PrintCommandLineFlags -version
Run Code Online (Sandbox Code Playgroud)

将显示默认的垃圾收集器.我还发现以下页面有用,详细说明了各种操作系统的默认垃圾收集器.

http://www.techpaste.com/2012/02/default-jvm-settings-gc-jit-java-heap-sizes-xms-xmx-operating-systems/#more-3569

  • 我在该命令的输出中看不到与垃圾收集器相关的标志/信息.我在Windows 7上使用Java 1.8.0_45. (4认同)
  • 这里的答案错误.不提供解决方案. (3认同)
  • @liltitus27您应该寻找可能的值:+UseParallelGC,+UseSerialGC,+UseConcMarkSweepGC,...,请参阅https://docs.oracle.com/javase/10/gctuning/available-collectors.htm#JSGCT-GUID-C7B19628 -27BA-4945-9004-EC0F08C76003 对我来说,这个答案必须被接受为有效。 (3认同)

小智 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);
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

例如,尝试按照以下命令了解各种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
Run Code Online (Sandbox Code Playgroud)


Luc*_*lis 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.

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


Eri*_*ang 10

(对于Java <= 8)

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

jmap -heap <pid> | grep GC

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

例如

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

例如

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

输出:

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

  • 这应该是公认的答案。对于 Java 9 和更新版本,使用 `jhsdb jmap --heap --pid &lt;pid&gt; | grep GC`。 (2认同)

Woo*_*Sun 7

您可以将以下 VM 参数与 JDK 14 一起使用,

-Xlog:gc -Xlog:gc*
Run Code Online (Sandbox Code Playgroud)

日志将是:

[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
Run Code Online (Sandbox Code Playgroud)


Gar*_*age -4

您可以使用-XXJRE 的标志来选择您所选择的垃圾收集器。

使用 5.0 Java TM 虚拟机调整垃圾收集

此外,您可以使用JConsole来监视垃圾收集。

  • 我知道你可以选择你的垃圾收集器,但是,我感兴趣的是找出 JVM 为我选择了哪个收集器;谁知道呢,也许它甚至可能根据使用情况即时改变策略! (2认同)