javagc:How是什么;所需幸存者人数“;计算

javagc:How是什么;所需幸存者人数“;计算,java,garbage-collection,jvm,Java,Garbage Collection,Jvm,我正在Solaris上使用HotSpot JVM 1.6.045。 以下是我关于堆的选项: -Xms8G -Xmx8G -XX:MaxTenuringThreshold=14 -XX:NewSize=2184M -XX:MaxNewSize=2184M -XX:SurvivorRatio=1 有了这些设置,我希望我的伊甸园大小和2名幸存者的大小都是728米。 在观察到VisualVM/VisualGC之后,我们得到的就是这个 下面是我的详细gc日志摘录: 2014-09-16T16:42:15

我正在Solaris上使用HotSpot JVM 1.6.045。 以下是我关于堆的选项:

-Xms8G
-Xmx8G
-XX:MaxTenuringThreshold=14
-XX:NewSize=2184M
-XX:MaxNewSize=2184M
-XX:SurvivorRatio=1
有了这些设置,我希望我的伊甸园大小和2名幸存者的大小都是728米。 在观察到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]
  • 为什么期望的幸存者大小等于“幸存者空间大小/2”
  • 我知道JVM会交替使用2个幸存者(每个728Mb),但我无法理解为什么它似乎使用了728Mb的一半(定义内存使用期限的期望幸存者大小)

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

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


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


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

    来自jclarity censum的家伙们,第二个问题是由于JVM中的一个bug。