确定活动的热点垃圾收集器

StackOverflow问题查找正在运行哪种类型的垃圾收集 器,jvm的默认垃圾收集器如何通过查看gc日志来查看正在运行的垃圾收集器? ,以及如何知道HotSpot jvm的当前GC策略? 和博客文章如何以编程方式获取GC信息表明了人们有时希望知道Java应用程序使用了哪个Java垃圾收集器。 在本文中,我将介绍确定与Oracle HotSpot VM中运行的Java应用程序关联的垃圾收集器的一些最简单,最常见的方法。

出于演示目的,我将运行一个简单的Java应用程序。 该应用程序的代码对于演示如何确定适用的垃圾收集器并不重要。 可以使用命令java -cp stringInstantiationsDemo.jar dustin.examples.demo.IndefiniteRun运行简单的Java应用程序。 请注意,对于要使用的垃圾收集器,没有JVM标志的规范。 这意味着JVM将使用根据人体工程学选择的垃圾收集器。

确定所选垃圾收集器的一种简单方法是使用-XX:+ PrintCommandLineFlags标志 (我在博客文章JavaOne 2011:HotSpot Performance命令行选项的权威集 )中对此进行了描述。 该标志可以在命令java -XX:+PrintCommandLineFlags -cp stringInstantiationsDemo.jar dustin.examples.demo.IndefiniteRun如以下屏幕快照所示:

20160411-printCommandLineFlags-showsCollector

如最后一个屏幕快照所示,使用-XX:+PrintCommandLineFlags演示了-XX:+UseParallelGC标志的存在,该标志指示在这种情况下自动使用的收集器是并行收集器 (也称为吞吐量收集器)。

使用-XX:+PrintCommandLineFlags可以使我们看到在启动新的Java应用程序时按人体工程学选择的垃圾收集器工作正常。 当我们想看到已经在运行的Java进程使用的垃圾收集器时, jcmd派上了用场(我在jcmd文章中写道了这个有用的工具:一个JDK命令行工具来统治他们 )。 在下一个屏幕快照中jcmd进行了说明,该屏幕快照演示了如何使用jcmd查看已经运行的Java应用程序的JVM命令行标志。

20160411-printCommandLineFlags-showsCollector

从上一张图像中,我们看到可以使用jcmd <pid> VM.flags标识将指示正在使用的垃圾收集器的虚拟机标志。 在这种情况下,我们再次看到-XX:+UseParallelGC的存在,指示并行/吞吐量垃圾收集器的使用。

我刚刚演示了如何使用jcmd查看隐式JVM参数,该参数告诉我们在未明确指定垃圾收集器时为特定应用程序的VM自动选择了哪个垃圾收集器。 下两个图像显示JConsoleVisualVM不显示隐式JVM参数,因此不显示未指定时自动使用的垃圾收集器。

20160412-jconsoleOnlyShowsExplicitVMArgs

20160412-jvisualvmOnlyShowsExplicitVMArgs

尽管JConsole和VisualVM均未显示隐式Java虚拟机参数(例如隐式选择的垃圾收集器),但仍可以使用两种工具通过对象类型为java.lang:type=GarbageCollector JMXGarbageCollectorMXBean来确定使用中的垃圾收集器。 对于本文到目前为止使用的简单应用程序,它将是java.lang:type=GarbageCollector,name=PS MarkSweep因为这是并行或吞吐量收集器。 接下来的两个屏幕快照中的JConsoleVisualVM (通过MBeans插件 )对此进行了演示。

20160412-jconsoleMBeansPSMarkSweep

20160412-jvisualvmMBeansPSMarkSweep

上面的示例演示了确定哪种垃圾收集器适用的三种基本方法。 下表针对先前演示的并行/吞吐量收集器以及其他两个主要的Oracle HotSpot JVM收集器( CMSG1 )总结了这些内容。 下表显示了确定上述一种方法(在命令行, jcmd或JMX MXBean上明确指定)使用哪个收集器(并行,CMS或G1)时要查找的内容。

垃圾收集器 明确的命令行 jcmd VM.flags java.lang:type = GarbageCollector,name =
并行 / 吞吐量 -XX:+UseParallelOldGC
-XX:+UseParallelGC
PS MarkSweep
PS清道夫
并发标记扫描(CMS) -XX:+UseConcMarkSweepGC 并发标记扫描
垃圾优先(G1) -XX:+ UseG1GC G1老一代
G1青年一代

尽管未在此处显示,但从VisualVM或JConsole确定正在使用哪个收集器的另一种方法是使用 DiagnosticCommandMBean 来查找 VM.flagsjcmd 提供VM标志一样,如上所述。 在《 在JConsole和VisualVM中查看DiagnosticCommandMBean》 一文中,我已经写了使用 DiagnosticCommandMBean 完成 jcmd 行为的 博客 。

JVM通常会阻止提供两个不同的垃圾收集器标志。 当两次尝试启动Java应用程序同时存在时,将显示诸如“选项列表中的收集器组合冲突”的消息,并且Java进程将不会启动。 因此,只需要为与正在运行的Java应用程序关联的特定收集器标识一个标志,即可知道正在使用哪个收集器。 这篇文章演示了多种简单的方法,可用于确定在给定应用程序的JVM中应用了哪个HotSpot垃圾收集器。

翻译自: https://www.javacodegeeks.com/2016/04/determining-active-hotspot-garbage-collector.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值