簡體   English   中英

是什么導致完整的GC運行?

[英]What causes a full GC to run?

我有一個運行在tomcat上的Web應用程序,該應用程序的最大堆大小設置為8GB。

如果沒有用戶登錄到該應用程序,則不可清理內存(位於垃圾回收之后)將非常低,約為1GB。 在這種情況下,我看到內存持續增長約4GB,然后運行垃圾收集器,內存再次下降到約1GB。 如果沒有用戶登錄,此模式將繼續。

GC日志顯示完整的GC需要11秒,相當長的時間,而次要的GC需要1秒:

2017-02-14T15:30:44.553+0530: 591.922: [GC (Allocation Failure) [PSYoungGen: 1501051K->631966K(1833472K)] 2392189K->1523112K(3030016K), 1.5100144 secs] 
    ...[Times: user=1.49 sys=0.01, real=1.51 secs]

2017-02-14T15:31:20.335+0530: 627.705: [GC (Allocation Failure) [PSYoungGen: 1553054K->595007K(1842176K)] 2444200K->1570521K(3038720K), 1.3050284 secs] 
    ...[Times: user=1.27 sys=0.04, real=1.31 secs]

2017-02-14T15:33:33.682+0530: 761.052: [GC (Allocation Failure) [PSYoungGen: 1516095K->556800K(1842176K)] 2491609K->1596474K(3038720K), 1.6957154 secs] 
    ...[Times: user=1.67 sys=0.03, real=1.69 secs]

2017-02-14T15:33:35.378+0530: 762.748: [Full GC (Ergonomics) [PSYoungGen: 556800K->365446K(1842176K)] [ParOldGen: 1039673K->1196476K(2018304K)] 1596474K->1561923K(3860480K), [Metaspace: 70472K->70472K(1114112K)], 11.2779843 secs] 
    ...[Times: user=11.13 sys=0.09, real=11.28 secs]

2017-02-14T15:34:56.232+0530: 843.602: [GC (Allocation Failure) [PSYoungGen: 1286534K->216613K(1842176K)] 2483011K->1609875K(3860480K), 1.4938761 secs] 
    ...[Times: user=1.45 sys=0.05, real=1.50 secs]

由於所有其他線程在GC期間都會掛起,因此,如果用戶嘗試在Full GC期間訪問webapp,則服務器不會響應。 是什么觸發了此Full GC?

根據日志,次要GC事件是由於分配失敗而引起的,而完全GC是由於Ergonomics引起的。 這是什么意思?

還有足夠的可用堆空間,我想延遲發生完全GC,直到由於次要GC導致內存沒有顯着減少為止。 在這種情況下可以防止發生完全GC嗎?

我的VM參數如下:

export CATALINA_OPTS="$CATALINA_OPTS -Xms512m -Xmx8192m -XX:+UseConcMarkSweepGC"

我會將您指向“ 並行收集器”鏈接。 “人體工程學”是一種根據應用程序的特定行為自動調整收集器的方法。

在大多數情況下,自動調整是可以的。 在您的情況下,它似乎以太長的GC結尾。 您可以通過自己調整收集器的參數來修復它。

引用文檔:

最大垃圾回收暫停時間

最大暫停時間目標是通過命令行選項-XX:MaxGCPauseMillis =指定的。 這被解釋為需要毫秒或更少的暫停時間的提示。 默認情況下,沒有最大暫停時間目標。 如果指定了暫停時間目標,則會調整堆大小和與垃圾回收相關的其他參數,以使垃圾回收的暫停時間短於指定值。 這些調整可能導致垃圾收集器降低應用程序的整體吞吐量,並且無法始終滿足所需的暫停時間目標。

通量

吞吐量目標是根據進行垃圾收集所花費的時間與在垃圾收集之外所花費的時間(稱為應用程序時間)來衡量的。 該目標由命令行選項-XX:GCTimeRatio =指定,該選項將垃圾回收時間與應用程序時間的比率設置為1 /(1 +)。

例如,-XX:GCTimeRatio = 19將垃圾收集目標的目標設置為總時間的1/20或5%。 默認值為99,導致垃圾回收的目標時間為1%。

腳印

使用選項-Xmx指定最大堆占用空間。 另外,收集器還有一個隱含的目標,即只要滿足其他目標,就將堆的大小最小化。

解決您的主要問題(服務器由於浪費大量的時間進行垃圾收集而導致停頓),這可能是由於某種原因使用了錯誤的垃圾收集器所致。 此處記錄垃圾回收調整。 使用Garbage-First收集器,您可以設置仍然可以接受的任何暫停(默認值為200毫秒,這對於服務器來說應該不是什么大問題)。

暫無
暫無

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

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