簡體   English   中英

如何在G1GC中觸發舊一代的收集

[英]How to trigger collection of Old Generation in G1GC

最近,我們的一些服務器由於段錯誤而崩潰。 盡管我沒有被證明的根本原因,但我確實有一種直覺,它與我們的應用程序如何進行垃圾回收,我們完成的GC調整以及內存配置文件有關。

調查這些崩潰的多次發生,我從JVM的角度確定了一種模式:

  • 崩潰前,線程數增加到正常水平
  • 在崩潰之前,總體堆使用情況的通常正常的鋸齒模式消失了,堆大小不斷增加而沒有減少
  • 在崩潰之前,堆的年輕一代一直很低,並且似乎沒有調整大小或使用量增長
  • 崩潰之前,舊一代的大小要大於過去任何舊一代的大小,並且似乎沒有被清理或收集
  • segfault總是與活動的GC線程有關,特別是copy_to_survivor_space

盡管我看不到有發生內存不足的確鑿證據,但我認為我們確實為應用程序耗盡了堆空間。 如果G1GC無法在撤離或提升前將年輕物體復制到幸存者空間,那么從邏輯上講,它沒有足夠的空間來這樣做。 分析GC日志,我認為Humongous對象沒有太多關系,因為我認為它們並沒有占用堆空間。

查看內存配置文件,我的直覺是我應該將InitiatingHeapOccupancyPercent減小到接近默認值45,以便更早觸發收集周期。 在我看來,尤其是考慮到老一代的規模不斷擴大,混合/完整GC的觸發需要更頻繁或更短的觸發時間。 如何啟動完整/混合收藏?

根據提供的信息,是否有其他想法或意見可以使我更快地觸發收款? 我是否誤解了段錯誤消息並走錯了路? 我還可以做些什么來收集可能使我能夠解決崩潰根本原因的信息?


Detail
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007f38aa2655f5, pid=6293, tid=0x00007f3894efe700
#
# JRE version: Java(TM) SE Runtime Environment (8.0_162-b12) (build 1.8.0_162-b12)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.162-b12 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# V  [libjvm.so+0x5c85f5]  G1ParScanThreadState::copy_to_survivor_space(InCSetState, oopDesc*, markOopDesc*)+0x45
#

內存快照

JVM選項:

-XX:MaxHeapSize=30g
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:InitiatingHeapOccupancyPercent=70
-XX:-OmitStackTraceInFastThrow
-XX:+AlwaysPreTouch
-XX:+UseStringDeduplication
-XX:+UseCompressedOops

-Xloggc:/usr/local/company/logs/gc.log
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=100M
-XX:+PrintAdaptiveSizePolicy
-XX:+PrintGCApplicationConcurrentTime
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCCause
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC
-XX:+PrintReferenceGC
-XX:+PrintTenuringDistribution
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/usr/local/company/logs/heapdump_126960.hprof

我是否誤解了段錯誤消息並走錯了路?

是的,堆OOM絕不應導致段錯誤 ,而應僅通過異常/可拋出機制觸發內存不足錯誤 崩潰簽名指向JVM錯誤或由外部因素(JVM進程中加載​​的本地庫,內存損壞, Unsafe錯誤使用)引起的堆損壞。

嘗試升級JVM,然后查看原因是否已在較新版本中解決。 如果這樣做沒有幫助,請嘗試刪除部分應用程序,依賴項,Java代理等,或者在其他硬件上運行。

暫無
暫無

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

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