确定活动的热点垃圾收集器
StackOverflow問(wèn)題查找正在運(yùn)行哪種類型的垃圾收集 器,jvm的默認(rèn)垃圾收集器 , 如何通過(guò)查看gc日志來(lái)查看正在運(yùn)行的垃圾收集器? ,以及如何知道HotSpot jvm的當(dāng)前GC策略? 和博客文章如何以編程方式獲取GC信息表明了人們有時(shí)希望知道Java應(yīng)用程序使用了哪個(gè)Java垃圾收集器。 在本文中,我將介紹確定與Oracle HotSpot VM中運(yùn)行的Java應(yīng)用程序關(guān)聯(lián)的垃圾收集器的一些最簡(jiǎn)單,最常見(jiàn)的方法。
出于演示目的,我將運(yùn)行一個(gè)簡(jiǎn)單的Java應(yīng)用程序。 該應(yīng)用程序的代碼對(duì)于演示如何確定適用的垃圾收集器并不重要。 可以使用命令java -cp stringInstantiationsDemo.jar dustin.examples.demo.IndefiniteRun運(yùn)行簡(jiǎn)單的Java應(yīng)用程序。 請(qǐng)注意,對(duì)于要使用的垃圾收集器,沒(méi)有JVM標(biāo)志的規(guī)范。 這意味著JVM將使用根據(jù)人體工程學(xué)選擇的垃圾收集器。
確定所選垃圾收集器的一種簡(jiǎn)單方法是使用-XX:+ PrintCommandLineFlags標(biāo)志 (我在博客文章JavaOne 2011:HotSpot Performance命令行選項(xiàng)的權(quán)威集 )中對(duì)此進(jìn)行了描述。 該標(biāo)志可以在命令java -XX:+PrintCommandLineFlags -cp stringInstantiationsDemo.jar dustin.examples.demo.IndefiniteRun如以下屏幕快照所示:
如最后一個(gè)屏幕快照所示,使用-XX:+PrintCommandLineFlags演示了-XX:+UseParallelGC標(biāo)志的存在,該標(biāo)志指示在這種情況下自動(dòng)使用的收集器是并行收集器 (也稱為吞吐量收集器)。
使用-XX:+PrintCommandLineFlags可以使我們看到在啟動(dòng)新的Java應(yīng)用程序時(shí)按人體工程學(xué)選擇的垃圾收集器工作正常。 當(dāng)我們想看到已經(jīng)在運(yùn)行的Java進(jìn)程使用的垃圾收集器時(shí), jcmd派上了用場(chǎng)(我在jcmd文章中寫(xiě)道了這個(gè)有用的工具:一個(gè)JDK命令行工具來(lái)統(tǒng)治他們 )。 在下一個(gè)屏幕快照中jcmd進(jìn)行了說(shuō)明,該屏幕快照演示了如何使用jcmd查看已經(jīng)運(yùn)行的Java應(yīng)用程序的JVM命令行標(biāo)志。
從上一張圖像中,我們看到可以使用jcmd <pid> VM.flags標(biāo)識(shí)將指示正在使用的垃圾收集器的虛擬機(jī)標(biāo)志。 在這種情況下,我們?cè)俅慰吹?XX:+UseParallelGC的存在,指示并行/吞吐量垃圾收集器的使用。
我剛剛演示了如何使用jcmd查看隱式JVM參數(shù),該參數(shù)告訴我們?cè)谖疵鞔_指定垃圾收集器時(shí)為特定應(yīng)用程序的VM自動(dòng)選擇了哪個(gè)垃圾收集器。 下兩個(gè)圖像顯示JConsole和VisualVM不顯示隱式JVM參數(shù),因此不顯示未指定時(shí)自動(dòng)使用的垃圾收集器。
盡管JConsole和VisualVM均未顯示隱式Java虛擬機(jī)參數(shù)(例如隱式選擇的垃圾收集器),但仍可以使用兩種工具通過(guò)對(duì)象類型為java.lang:type=GarbageCollector JMX和GarbageCollectorMXBean來(lái)確定使用中的垃圾收集器。 對(duì)于本文到目前為止使用的簡(jiǎn)單應(yīng)用程序,它將是java.lang:type=GarbageCollector,name=PS MarkSweep因?yàn)檫@是并行或吞吐量收集器。 接下來(lái)的兩個(gè)屏幕快照中的JConsole和VisualVM (通過(guò)MBeans插件 )對(duì)此進(jìn)行了演示。
上面的示例演示了確定哪種垃圾收集器適用的三種基本方法。 下表針對(duì)先前演示的并行/吞吐量收集器以及其他兩個(gè)主要的Oracle HotSpot JVM收集器( CMS和G1 )總結(jié)了這些內(nèi)容。 下表顯示了確定上述一種方法(在命令行, jcmd或JMX MXBean上明確指定)使用哪個(gè)收集器(并行,CMS或G1)時(shí)要查找的內(nèi)容。
| -XX:+UseParallelOldGC -XX:+UseParallelGC | PS MarkSweep PS清道夫 | |
| -XX:+UseConcMarkSweepGC | 并發(fā)標(biāo)記掃描 | |
| -XX:+ UseG1GC | G1老一代 G1青年一代 | |
盡管未在此處顯示,但從VisualVM或JConsole確定正在使用哪個(gè)收集器的另一種方法是使用 DiagnosticCommandMBean 來(lái)查找 VM.flags , jcmd 提供VM標(biāo)志一樣,如上所述。 在《 在JConsole和VisualVM中查看DiagnosticCommandMBean》 一文中,我已經(jīng)寫(xiě)了使用 DiagnosticCommandMBean 完成 jcmd 行為的 博客 。
JVM通常會(huì)阻止提供兩個(gè)不同的垃圾收集器標(biāo)志。 當(dāng)兩次嘗試啟動(dòng)Java應(yīng)用程序同時(shí)存在時(shí),將顯示諸如“選項(xiàng)列表中的收集器組合沖突”的消息,并且Java進(jìn)程將不會(huì)啟動(dòng)。 因此,只需要為與正在運(yùn)行的Java應(yīng)用程序關(guān)聯(lián)的特定收集器標(biāo)識(shí)一個(gè)標(biāo)志,即可知道正在使用哪個(gè)收集器。 這篇文章演示了多種簡(jiǎn)單的方法,可用于確定在給定應(yīng)用程序的JVM中應(yīng)用了哪個(gè)HotSpot垃圾收集器。
翻譯自: https://www.javacodegeeks.com/2016/04/determining-active-hotspot-garbage-collector.html
總結(jié)
以上是生活随笔為你收集整理的确定活动的热点垃圾收集器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 西藏自治区消防(西藏消防备案)
- 下一篇: Java:不朽的对象和对象复活