我正在使用一个带有G1 GC的应用程序。当旧的gen使用率超过一定水平时,是否有触发主要GC的参数?现在,我的堆使用情况如下所示
Heap Usage:
G1 Heap:
regions = 1504
capacity = 1577058304 (1504.0MB)
used = 1183184896 (1128.373046875MB)
free = 393873408 (375.626953125MB)
75.02480364860372% used
G1 Young Generation:
Eden Space:
regions = 540
capacity = 823132160 (785.0MB)
used = 566231040 (540.0MB)
free = 256901120 (245.0MB)
68.78980891719745% used
Survivor Space:
regions = 15
capacity = 15728640 (15.0MB)
used = 15728640 (15.0MB)
free = 0 (0.0MB)
100.0% used
G1 Old Generation:
regions = 580
capacity = 738197504 (704.0MB)
used = 600176640 (572.373046875MB)
free = 138020864 (131.626953125MB)
81.30298961292614% used虽然旧的gen利用率在80%以上,但不会触发主要GC。如果我运行以下命令,就会触发一个主要的GC,并收集我的旧gen中的大多数对象。有没有办法周期性地触发这样的主要GC?
jmap -histo:live <pid>JVM启动时提供的GC相关选项
-server -Xms1503m -Xmx1503m -Xss512k -XX:ReservedCodeCacheSize=240m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -XX:+UseG1GC -XX:MaxGCPauseMillis=2000 -XX:+UseStringDeduplication -XX:+UnlockExperimentalVMOptions -XX:G1NewSizePercent=30发布于 2018-08-23 15:21:44
对于G1,初始标记阶段由占用率触发,即堆有多满。默认情况下,初始占用份额是45%,但这是整个堆的份额,而不是旧的gen。
您可以使用-XX:InitiatingHeapOccupancyPercent标志更改它,并将其设置为小于45的值。你看到的是老一代,这似乎有点奇怪。80%是满的。由于G1与应用程序线程并发地执行某些阶段,因此您提升的速度可能会使堆填满的速度快于G1回收的速度,但这似乎不太可能。
还有一个实验性的标志,-XX:G1MixedGCLiveThresholdPercent,您可能想要看看。这里有更多信息:
https://www.oracle.com/technetwork/articles/java/g1gc-1984535.html
https://stackoverflow.com/questions/51976739
复制相似问题