簡體   English   中英

為什么JVM僅在使用CMS垃圾收集器時會隨着時間的推移而減慢?

[英]Why does the JVM slow down over time only when using the CMS garbage collector?

我有一個使用Nashorn的應用程序。 出於我的示例的目的,我創建了一個ScriptContext,我通過執行一些Javascript來創建一些全局變量,然后通過在緊密循環中調用NashornScriptEngine#eval(String, ScriptContext)在一個線程中反復使用該上下文。 我沒有將結果存儲在任何地方,據我所知,我的應用程序代碼不會導致任何副作用。

使用默認的GC,這可以無限期地正常工作。 但是當我使用-XX:+UseConcMarkSweepGC運行相同的應用程序時-XX:+UseConcMarkSweepGC性能會隨着時間的推移而顯着降低。 程序啟動時,運行1,000,000次迭代大約需要2分鍾。 但是2小時后,相同的1,000,000次迭代大約需要4分鍾。 它從那里開始變得更糟。

我還經常測試丟棄NashornScriptEngine實例和ScriptContext,完全從頭開始。 此時,我的應用程序沒有引用上一次執行中的任何變量。 這並沒有改善這些性能問題。

知道發生了什么事嗎? 我需要運行-XX:+UseConcMarkSweepGC因為這只是一個較大的長期應用程序的一小部分。

我在下面的Java Mission Control中有一些截圖(取自Flight Recorder)。

謝謝!

堆參考對象頂級種植者

在這里,我選擇了兩個GC,一個從錄制開始,一個從最后開始。 請注意“JNI弱參考”時間如何顯着增加,“GC暫停”也是如此。

GC開始時GC結束

有一個錯誤https://bugs.openjdk.java.net/browse/JDK-8177098 您可以嘗試解決方法 - 每次都重新創建NashornScriptEngineFactory嗎?

正如您自己所說,它在JNI ref處理中花費了大量時間。 默認情況下,這是單線程的。 設置-XX:+ParallelRefProcEnabled讓它-XX:+ParallelRefProcEnabled運行。

由於您正在使用動態生成字節碼的nashorn引擎,因此也可能是類卸載或缺少類的問題,但這在您的日志中並不明顯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM