Java 如何在G1GC中触发旧代的收集

Java 如何在G1GC中触发旧代的收集,java,garbage-collection,g1gc,Java,Garbage Collection,G1gc,最近,我们的一些服务器由于故障而崩溃。虽然我没有一个被证实的根本原因,但我有一种预感,它与我们的应用程序是如何被垃圾收集的、我们所做的GC调优以及内存配置文件有关 通过调查这些崩溃的多次发生,我从JVM的角度确定了一种模式: 崩溃之前,线程数增加到高于正常水平 崩溃之前,总体堆使用情况的一般正常锯齿模式消失,堆大小增长而不减少 在崩溃之前,堆的年轻一代一直很低,并且似乎不会调整大小或增加使用量 在崩溃之前,老一代人的体型比过去任何老一代人的体型都要大,而且似乎没有被清理或收集 segfault总

最近,我们的一些服务器由于故障而崩溃。虽然我没有一个被证实的根本原因,但我有一种预感,它与我们的应用程序是如何被垃圾收集的、我们所做的GC调优以及内存配置文件有关

通过调查这些崩溃的多次发生,我从JVM的角度确定了一种模式:

崩溃之前,线程数增加到高于正常水平 崩溃之前,总体堆使用情况的一般正常锯齿模式消失,堆大小增长而不减少 在崩溃之前,堆的年轻一代一直很低,并且似乎不会调整大小或增加使用量 在崩溃之前,老一代人的体型比过去任何老一代人的体型都要大,而且似乎没有被清理或收集 segfault总是与活动GC线程有关,特别是将\u复制到\u survivor\u空间 虽然我没有看到内存不足的确凿证据,但我认为应用程序的堆空间确实已经用完了。如果G1GC无法在疏散或提升之前将年轻物体复制到幸存者空间,那么从逻辑上讲,G1GC似乎没有足够的空间进行复制。通过分析GC日志,我看不到与庞大的对象有什么关系,因为我不认为它们占用了堆中的大量空间

查看内存配置文件,我的直觉是,我应该将InitiatingHeapOccupanceTypercent的值降低到接近默认值45的值,以便更早地触发收集周期。在我看来,尤其是考虑到老一代的规模不断增长,混合/完整GC需要更频繁或至少更早地触发。如何启动完整/混合收集

根据所提供的信息,是否有其他想法或意见,我可以触发收集更快?我是否误解了segfault信息,并走错了方向?我还可以做些什么来收集可能使我能够解决崩溃根本原因的信息

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
我是否误解了segfault信息,并走错了方向

是的,堆oom不应该导致segfault,相反,它们应该只通过异常/可丢弃机制触发。崩溃签名指向JVM错误或堆损坏,这是由加载到JVM进程中的本机库、内存损坏、不安全数据的不正确使用等外部因素造成的

尝试升级JVM,看看原因是否已在较新版本中修复。如果这没有帮助,请尝试删除部分应用程序、依赖项、java代理等,或者在不同的硬件上运行

-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