[英]How to trigger collection of Old Generation in G1GC
最近,我們的一些服務器由於段錯誤而崩潰。 盡管我沒有被證明的根本原因,但我確實有一種直覺,它與我們的應用程序如何進行垃圾回收,我們完成的GC調整以及內存配置文件有關。
調查這些崩潰的多次發生,我從JVM的角度確定了一種模式:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.