我在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]
我理解JVM可以使用2个幸存者(每个728Mb),但是我无法理解为什么它似乎使用728Mb的一半(所需的幸存者大小定义何时内存将被终身)
答案 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中将某些对象移动到旧代。
我也对第二个问题感兴趣。