为什么minor GC如此频繁

Jac*_*ack 4 java garbage-collection jvm

这是我的JVM参数:

> /usr/local/java/bin/java -Xloggc:log/gc.log -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:PermSize=64m -XX:MaxPermSize=64m -Xss128K -server -Xmn1024m -Xms3027m -Xmx3027m -Dresin.home=/usr/local/resin
Run Code Online (Sandbox Code Playgroud)

我用的是Resin,上面是Resin start JVM参数,下面是我用jstat -gcutil pid 1000 1000时的GC输出

   S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   

  0.00   1.60  46.21  25.62  21.69  72639  941.082    31    0.275  941.357

  1.51   0.00  51.91  25.63  21.69  72640  941.093    31    0.275  941.368

  0.00   1.87  62.96  25.64  21.69  72641  941.104    31    0.275  941.379

  1.51   0.00  86.39  25.65  21.69  72642  941.114    31    0.275  941.389

  0.00   1.56  94.28  25.65  21.69  72643  941.126    31    0.275  941.401

  0.00   1.45   5.03  25.67  21.69  72645  941.146    31    0.275  941.421

  1.74   0.00  18.76  25.68  21.69  72646  941.158    31    0.275  941.433

  0.00   1.85  37.51  25.69  21.69  72647  941.169    31    0.275  941.443

  1.59   0.00  53.58  25.70  21.69  72648  941.180    31    0.275  941.455

  0.00   1.74  74.02  25.71  21.69  72649  941.192    31    0.275  941.467
Run Code Online (Sandbox Code Playgroud)

我们每秒可以找到一次minor GC,我觉得它很频繁,因为我的新Edanz大小是1g。那么为什么这么频繁呢,或者这是正常的事情?

Pet*_*rey 5

要么您的 Eden 大小不是 1 GB,要么您正在创建令人难以置信的垃圾。由于您似乎没有设置 Eden 大小,因此怀疑它比您想象的要小得多。

尝试使用jstat -gccause来查看尺寸。

我怀疑您一直在阅读http://www.caucho.com/resin-3.0/performance/jvm-tuning.xtp,其中错误地说明了-Xmn设置伊甸园空间。;)

-Xmx选项设置最大总堆大小(年轻和年老)

-Xmn选项设置由伊甸园空间和两个幸存者空间组成的年轻代的大小。由于您的幸存者空间似乎不是很满,我怀疑它们占了年轻代 1 G 的大部分。

http://www.oracle.com/technetwork/java/javase/tech/exactoptions-jsp-141536.html

尝试将 设置为-XX:SurvivorRatio=10 之类的内容,1 GB 中的大部分将是 Eden 空间。

http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html