Java GC:如何计算“期望幸存者大小”?

时间:2014-09-17 10:07:23

标签: java garbage-collection jvm

我在Solaris上使用HotSpot JVM 1.6.0_45。 以下是我对Heap的选择:

-Xms8G
-Xmx8G
-XX:MaxTenuringThreshold=14
-XX:NewSize=2184M
-XX:MaxNewSize=2184M
-XX:SurvivorRatio=1

通过这些设置,我希望我的伊甸园大小和2个幸存者都具有相同的728M大小。 观察VisualVM / VisualGC后,我们得到了它。

这是我的详细gc日志的摘录:

2014-09-16T16:42:15.357+0200: 6.796: [GC 6.796: [ParNew Desired survivor size 381681664 bytes, new threshold 14 (max 14)
- age   1:   16125960 bytes,   16125960 total
- age   2:   16259512 bytes,   32385472 total
- age   3:    2435240 bytes,   34820712 total
- age   4:   17179320 bytes,   52000032 total
- age   5:   43986952 bytes,   95986984 total
- age   6:   20858328 bytes,  116845312 total
- age   7:   31571664 bytes,  148416976 total
- age   8:   41614872 bytes,  190031848 total
- age   9:   33191568 bytes,  223223416 total
- age  10:   22887432 bytes,  246110848 total
- age  11:        168 bytes,  246111016 total
- age  12:        184 bytes,  246111200 total 
: 1006811K->407353K(1490944K), 0.3248414 secs] 1006811K->407353K(7643136K), 0.3252604 secs] [Times: user=3.70 sys=0.04, real=0.33 secs] 
2014-09-16T16:42:24.650+0200: 16.089: [GC 16.089: [ParNew Desired survivor size 381681664 bytes, new threshold 14 (max 14)
- age   1:   21959968 bytes,   21959968 total
- age   2:   11169584 bytes,   33129552 total
- age   3:   15663128 bytes,   48792680 total
- age   4:    2435168 bytes,   51227848 total
- age   5:   17177584 bytes,   68405432 total
- age   6:   43976040 bytes,  112381472 total
- age   7:   20246264 bytes,  132627736 total
- age   8:   31478896 bytes,  164106632 total
- age   9:   41613872 bytes,  205720504 total
- age  10:   33190832 bytes,  238911336 total
- age  11:   22889304 bytes,  261800640 total
- age  12:        168 bytes,  261800808 total
- age  13:        184 bytes,  261800992 total
: 1152825K->302652K(1490944K), 0.3356240 secs] 1152825K->302652K(7643136K), 0.3360389 secs] [Times: user=3.96 sys=0.03, real=0.34 secs]
  1. 为什么期望的幸存者大小等于"幸存者空间大小/ 2" ?
  2. 我理解JVM可以使用2个幸存者(每个728Mb),但是我无法理解为什么它似乎使用728Mb的一半(所需的幸存者大小定义何时内存将被终身)

    1. 从一个GC到另一个GC,年龄x + 1的字节应等于或小于等于前一个GC的年龄x的字节。但在我的例子中,为什么第二个GC的年龄11(22889304字节)高于第一个GC的年龄10(22887432个字节)?

2 个答案:

答案 0 :(得分:1)

目标SurvivorRation的默认值为50%。请参阅jvm选项-XX:TargetSurvivorRatio = 50

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

答案 1 :(得分:0)

关于第一个问题,期望的幸存者空间是指每个次要GC之后活动对象使用的最大幸存者空间,由SURVIVOR_SPACE * TargetSurvivorRatio / 100计算,因此默认情况下您获得幸存者空间的一半。如果活动对象的大小超过了所需的幸存者空间,JVM将降低阈值以强制在下一个GC中将某些对象移动到旧代。

我也对第二个问题感兴趣。