【发布时间】:2013-08-01 19:22:40
【问题描述】:
我正在开发一个完全用 Java 编写的内存数据库。我们有一个向系统提供数据的输入源,这是提取/加载阶段。运行此程序时,我注意到 JVM 挂起,根本原因是触发了 Full GC。然后应用程序被冻结,随后出现 OutOfMemory 错误(超出 GC 开销限制)
检查 GC 日志发现有很多新旧垃圾收集。 令人惊讶的是,Desired Survivor 的大小为负数。我试图理解为什么会这样?有没有人遇到过这种情况?
环境:
- Windows7 专业服务包1
- Dell Precision T7500,24 核
- 64 位操作系统 192 GB RAM
Sun JDK 版本: 1.7.0_13-b20(64位)
JVM 设置:
- -Xmx100g
- -Xms100g
- -verbose:gc
- -Xloggc:C:/temp/logs/gc.log
- -XX:+PrintGCTimeStamps
- -XX:+PrintGCDetails
- -XX:+PrintTenuringDistribution
- -XX:MaxPermSize=256m
- -XX:+UseParallelOldGC
GC 日志摘录(这不是完整的日志):
0.666: [GC 所需的幸存者大小 178913280 字节,新阈值 7(最大 15) [PSYoungGen: 524289K->4431K(30583488K)] 524289K->4503K(100488576K), 0.0052536 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]
0.671: [完整 GC (系统) [PSYoungGen: 4431K->0K(30583488K)] [ParOldGen: 72K->4096K(69905088K)] 4503K->4096K(100488576K) [PSPermGen: 8852K->8847K(21248K) ], 0.0853597 secs] [Times: user=0.08 sys=0.00, real=0.09 secs]
12.306: [GC 所需的幸存者大小 178913280 字节,新阈值 7(最大 15) [PSYoungGen: 26214464K->389676K(30583488K)] 26218560K->393868K(100488576K), 0.1907519 secs] [Times: user=0.69 sys=0.69, real=0.19 secs]
19.845: [GC 所需的幸存者大小 178913280 字节,新阈值 7(最大 15) [PSYoungGen: 26604140K->4369012K(30583488K)] 26608334K->4539738K(100488576K), 2.0671426 secs] [Times: user=12.67 sys=10.64, real=2.07 secs]
31.930: [GC 所需的幸存者大小 178913280 字节,新阈值 7(最大 15) [PSYoungGen: 30583476K->4368998K(30583488K)] 30764447K->5793376K(100488576K), 2.4316614 secs] [Times: user=14.32 sys=12.07, real=2.43 secs]
43.950: [GC 所需的幸存者大小 178913280 字节,新阈值 7(最大 15) [PSYoungGen: 30583462K->4369018K(30583488K)] 32008283K->10474103K(100488576K), 3.0868838 secs] [Times: user=31.76 sys=10.64, real=3.09 secs]
57.851: [GC 所需的幸存者大小 -954466304 字节,新阈值 6(最大 15) [PSYoungGen: 30583482K->4369011K(16019904K)] 36688571K->19053916K(85924992K), 5.0616910 secs] [Times: user=45.58 sys=21.95, real=5.06 secs]
67.849: [GC 所需的幸存者大小 -954466304 字节,新阈值 5(最大 15) [PSYoungGen: 16019891K->7854065K(23301696K)] 30706222K->22540396K(93206784K), 1.9574226 secs] [Times: user=35.38 sys=0.00, real=1.96 secs]
74.940: [GC 所需的幸存者大小 -954466304 字节,新阈值 4(最大 15) [PSYoungGen: 19504945K->11650800K(23301696K)] 34191281K->27450594K(93206784K), 3.2089939 secs] [Times: user=54.41 sys=1.51, real=3.21 secs]
83.683: [GC 所需的幸存者大小 -954466304 字节,新阈值 3(最大 15) [PSYoungGen: 23301680K->11650785K(23301696K)] 39101518K->32434323K(93206784K), 4.8105989 secs] [Times: user=65.82 sys=10.30, real=4.81 secs]
93.647: [GC 所需的幸存者大小 -954466304 字节,新阈值 2(最大 15) [PSYoungGen: 23301665K->10083445K(23301696K)] 44085203K->35191108K(93206784K), 3.9481522 secs] [Times: user=54.77 sys=8.02, real=3.95 secs]
102.406: [GC 所需的幸存者大小 -954466304 字节,新阈值 1(最大 15) [PSYoungGen: 21734325K->10417779K(23301696K)] 46841988K->39667600K(93206784K), 4.7031362 secs] [Times: user=63.29 sys=9.50, real=4.70 secs]
112.109: [GC 所需的幸存者大小 -954466304 字节,新阈值 1(最大 15) [PSYoungGen: 22068659K->5501380K(23301696K)] 51318480K->45289996K(93206784K), 5.6499475 secs] [Times: user=51.39 sys=23.81, real=5.65 secs]
122.858: [GC 所需的幸存者大小 -954466304 字节,新阈值 1(最大 15) [PSYoungGen: 17152260K->5829244K(23301696K)] 56941300K->51036174K(93206784K), 3.9348524 secs] [Times: user=47.49 sys=11.48, real=3.93 secs]
132.599: [GC 所需的幸存者大小 -954466304 字节,新阈值 1(最大 15) [PSYoungGen: 17480124K->4411050K(23301696K)] 62703442K->55124929K(93206784K), 3.2682313 secs] [Times: user=35.46 sys=10.86, real=3.27 secs]
141.869: [GC 所需的幸存者大小 -954466304 字节,新阈值 1(最大 15) [PSYoungGen: 16061930K->5983419K(23301696K)] 66775809K->61080627K(93206784K), 3.1660854 secs] [Times: user=38.39 sys=9.45, real=3.17 secs]
149.996: [GC 所需的幸存者大小 -954466304 字节,新阈值 1(最大 15) [PSYoungGen: 17634299K->5335607K(23301696K)] 72731507K->65656597K(93206784K), 4.4767380 secs] [Times: user=55.41 sys=12.67, real=4.48 secs]
154.473:[全gc [psyounggen:5335607k-> 0k(23301696k)] [帕尔林:60320990k-> 29187977k-> 29187977k-> 29187977k(93206784k)[pspermgen:53148k-> 53088k(106560k)],55.6080316 secs] [Times: user=518.19 sys=3.43, real=55.61 secs]
210.083: [GC 所需的幸存者大小 -954466304 字节,新阈值 1(最大 15) [PSYoungGen: 1942K->96K(23301696K)] 29189919K->29188073K(93206784K), 0.0512343 secs] [Times: user=0.50 sys=0.00, real=0.05 secs]
210.134:[全gc [psyounggen:96k-> 0k(23301696k)] [29187816K(69905088k)] 29188073k-> 29187816k(93206784k)[PSPermgen:53088K-> 53087K(106624K),15.5128928 secs] [Times: user=236.31 sys=0.19, real=15.51 secs]
239.525: [GC 所需的幸存者大小 -954466304 字节,新阈值 1(最大 15) [PSYoungGen: 11650880K->4622965K(23301696K)] 40838696K->33810782K(93206784K), 1.2739696 secs] [Times: user=23.01 sys=0.00, real=1.27 secs]
248.572: [GC 所需的幸存者大小 -954466304 字节,新阈值 1(最大 15) [PSYoungGen: 16273845K->4009690K(23301696K)] 45461663K->37894227K(93206784K), 2.3307283 secs] [Times: user=41.84 sys=0.00, real=2.33 secs]
256.854: [GC 所需的幸存者大小 -954466304 字节,新阈值 1(最大 15) [PSYoungGen: 15660570K->5707092K(23301696K)] 49545113K->43643553K(93206784K), 2.5595566 secs] [Times: user=46.05 sys=0.00, real=2.56 secs]
265.471: [GC 所需的幸存者大小 -954466304 字节,新阈值 1(最大 15) [PSYoungGen: 17357972K->4996932K(23301696K)] 55294440K->48690372K(93206784K), 2.8941178 secs] [Times: user=52.21 sys=0.00, real=2.89 secs]
275.795: [GC 所需的幸存者大小 -954466304 字节,新阈值 1(最大 15) [PSYoungGen: 16647812K->3781542K(23301696K)] 60342280K->52491436K(93206784K), 2.6240427 secs] [Times: user=47.18 sys=0.00, real=2.63 secs]
284.083: [GC 所需的幸存者大小 -954466304 字节,新阈值 1(最大 15) [PSYoungGen: 15432422K->5815192K(23301696K)] 64142316K->58360954K(93206784K), 2.3724770 secs] [Times: user=42.68 sys=0.00, real=2.37 secs]
291.659: [GC 所需的幸存者大小 -954466304 字节,新阈值 1(最大 15) [PSYoungGen: 17466072K->5357588K(23301696K)] 70011840K->63780322K(93206784K), 3.0063028 secs] [Times: user=54.20 sys=0.00, real=3.01 secs]
299.322: [GC 所需的幸存者大小 -1228210176 字节,新阈值 2(最大 15) [PSYoungGen: 17008468K->6341939K(23301696K)] 75431206K->70078817K(93206784K), 4.1999305 secs] [Times: user=65.35 sys=5.13, real=4.20 secs]
303.523:[全gc [psyounggen:6341939k-> 0k(23301696k)] [Parrodegen:6308305k(69905088K)] 70078817K-> 38098305K(93206784K)[PSPermgen:53125K-> 53125K(103360K),41.2081882秒]
您可以在上面日志中的 57.851 秒处注意到,我们的期望幸存者大小为负,我不确定为什么会这样?
这看起来像内存泄漏吗?
任何帮助将不胜感激。我还附上了堆的visualvm快照
【问题讨论】:
标签: java performance garbage-collection jvm out-of-memory