使用G1 GC定期触发主要GC

时间:2018-08-23 00:10:03

标签: java garbage-collection g1gc

我正在使用带有G1 GC的应用程序。当旧发电利用率超过一定水平时,是否有任何参数可触发主要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

尽管旧发电利用率高于80%,但不会触发大型GC。如果我运行以下命令,则会触发一个主要的GC并收集我的旧一代中的大多数对象。有没有办法定期触发这些主要的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

1 个答案:

答案 0 :(得分:0)

使用G1时,初始标记阶段由占用率(即堆满)触发。默认情况下,初始占用率是45%,但这是整个堆的一部分,而不是旧一代。

您可以使用-XX:InitiatingHeapOccupancyPercent标志更改此标志并将其设置为小于45的值。您看到的是旧一代似乎有点奇怪。 80%充满。由于G1与应用程序线程同时执行某些阶段,因此您可能以这样的速度进行升级:堆的填充速度比G1的回收速度快,但这似乎不太可能。

您可能还需要查看一个实验性标志-XX:G1MixedGCLiveThresholdPercent。这里有更多信息:

https://www.oracle.com/technetwork/articles/java/g1gc-1984535.html