垃圾收集算法,垃圾收集器
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
使用此标志,如以下屏幕快照所示:
如最后一个屏幕快照所示,使用-XX:+PrintCommandLineFlags
演示了-XX:+UseParallelGC
标志的存在,该标志指示在这种情况下自动使用的收集器是并行收集器 (也称为吞吐量收集器)。
使用-XX:+PrintCommandLineFlags
可以使我们看到在启动新的Java应用程序时按人体工程学选择的垃圾收集器运行良好。 当我们想看到已经在运行的Java进程使用的垃圾收集器时, jcmd会派上用场(我在jcmd文章中介绍了这个有用的工具:一个JDK命令行工具来统治他们 )。 在下一个屏幕快照中jcmd
进行了说明,该屏幕快照演示了如何使用jcmd
查看已经运行的Java应用程序的JVM命令行标志。
从上一个图像中,我们看到可以使用jcmd <pid> VM.flags
标识将指示正在使用的垃圾收集器的虚拟机标志。 在这种情况下,我们再次看到-XX:+UseParallelGC
的存在,指示并行/吞吐量垃圾收集器的使用。
我只是演示了如何使用jcmd
查看隐式JVM参数,该参数告诉我们在未明确指定垃圾收集器时为特定应用程序的VM自动选择了哪个垃圾收集器。 下两个图像显示JConsole和VisualVM不显示隐式JVM参数,因此不显示未指定时自动使用的垃圾收集器。
尽管JConsole和VisualVM均未显示隐式Java虚拟机参数(例如隐式选择的垃圾收集器),但仍可以使用两种工具通过对象类型为java.lang:type=GarbageCollector
JMX和GarbageCollectorMXBean来确定使用中的垃圾收集器。 对于本文到目前为止使用的简单应用程序,它将是java.lang:type=GarbageCollector,name=PS MarkSweep
因为这是并行或吞吐量收集器。 接下来的两个屏幕快照中的JConsole和VisualVM (通过MBeans插件 )对此进行了演示。
以上示例演示了确定三种垃圾收集器适用的三种基本方法。 下表针对先前演示的并行/吞吐量收集器以及其他两个主要的Oracle HotSpot JVM收集器( CMS和G1 )总结了这些内容。 下表显示了确定上述一种方法(在命令行, 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.flags
,其方式与 jcmd
提供VM标志的 方式相同, 如上所述。 在《 在JConsole和VisualVM中查看DiagnosticCommandMBean》 一文中,我已经写了使用 DiagnosticCommandMBean
完成 jcmd
行为的 博客 。
JVM通常会阻止提供两个不同的垃圾收集器标志。 如果在一次尝试启动Java应用程序的过程中存在两个,则将显示类似“选项列表中的收集器组合冲突”的消息,并且Java进程将不会启动。 因此,只需要为与正在运行的Java应用程序关联的特定收集器标识一个标志,即可知道正在使用哪个收集器。 这篇文章演示了多种简单的方法,可用于确定在给定应用程序的JVM中应用了哪个HotSpot垃圾收集器。
翻译自: https://www.javacodegeeks.com/2016/04/determining-active-hotspot-garbage-collector.html
垃圾收集算法,垃圾收集器