【发布时间】:2014-01-08 04:09:24
【问题描述】:
从 GC 日志来看,一段时间后,年轻代和年老代之间的堆大小似乎正在减少。
以下是日志中的三个条目。
{gc 调用之前的堆=5:
PSYoungGen 总计 44800K,已使用 44180K [0x18220000, 0x1b420000, 0x24a20000)
伊甸园空间 38400K,已使用 100% [0x18220000,0x1a7a0000,0x1a7a0000)
从空间 6400K,使用 90% [0x1ade0000,0x1b3853c8,0x1b420000)
到空间 6400K,使用 0% [0x1a7a0000,0x1a7a0000,0x1ade0000)
PSOldGen 总计 51200K,使用了 16K [0x0ba20000, 0x0ec20000, 0x18220000)
对象空间 51200K,已使用 0% [0x0ba20000,0x0ba24128,0x0ec20000)
PSPermGen 总计 32768K,已使用 12417K [0x03a20000, 0x05a20000, 0x0ba20000)
对象空间 32768K,已使用 37% [0x03a20000,0x046406c0,0x05a20000)
1047.599: [GC [PSYoungGen: 44180K->5990K(44032K)] 44197K->6006K(95232K), 0.0046671 秒]
gc 调用后堆=5:
PSYoungGen 总计 44032K,已使用 5990K [0x18220000, 0x1b5a0000, 0x24a20000)
伊甸园空间 37632K,0% 已使用 [0x18220000,0x18220000,0x1a6e0000)
从空间 6400K,使用 93% [0x1a7a0000,0x1ad79990,0x1ade0000)
到空间 7552K,使用 0% [0x1ae40000,0x1ae40000,0x1b5a0000)
PSOldGen 总计 51200K,使用了 16K [0x0ba20000, 0x0ec20000, 0x18220000)
对象空间 51200K,已使用 0% [0x0ba20000,0x0ba24128,0x0ec20000)
PSPermGen 总计 32768K,已使用 12417K [0x03a20000, 0x05a20000, 0x0ba20000)
对象空间 32768K,已使用 37% [0x03a20000,0x046406c0,0x05a20000)
}
{gc 调用之前的堆=174:
PSYoungGen 总计 9728K,已使用 9666K [0x18220000, 0x18d30000, 0x24a20000)
伊甸园空间 8640K,已使用 99% [0x18220000,0x18a8fa58,0x18a90000)
从空间 1088K,使用 94% [0x18a90000,0x18b910f0,0x18ba0000)
到空间 1344K,使用 0% [0x18be0000,0x18be0000,0x18d30000)
PSOldGen 总计 51200K,已使用 21113K [0x0ba20000, 0x0ec20000, 0x18220000)
对象空间 51200K,已使用 41% [0x0ba20000,0x0cebe540,0x0ec20000)
PSPermGen 总计 32768K,使用了 12611K [0x03a20000, 0x05a20000, 0x0ba20000)
对象空间 32768K,已使用 38% [0x03a20000,0x04670fa0,0x05a20000)
26968.748: [GC [PSYoungGen: 9666K->1271K(9920K)] 30780K->22465K(61120K), 0.0025274 秒]
gc 调用后的堆=174:
PSYoungGen 总计 9920K,使用了 1271K [0x18220000, 0x18d50000, 0x24a20000)
伊甸园空间 8576K,已使用 0% [0x18220000,0x18220000,0x18a80000)
从空间 1344K,使用 94% [0x18be0000,0x18d1dd00,0x18d30000)
到空间 1408K,使用 0% [0x18a80000,0x18a80000,0x18be0000)
PSOldGen 总计 51200K,已使用 21194K [0x0ba20000, 0x0ec20000, 0x18220000)
对象空间 51200K,已使用 41% [0x0ba20000,0x0ced29e0,0x0ec20000)
PSPermGen 总计 32768K,使用了 12611K [0x03a20000, 0x05a20000, 0x0ba20000)
对象空间 32768K,已使用 38% [0x03a20000,0x04670fa0,0x05a20000)
}
{gc 调用之前的堆=23195:
PSYoungGen 总计 1536K,使用了 1372K [0x18220000, 0x18440000, 0x24a20000)
伊甸园空间 896K,已使用 100% [0x18220000,0x18300000,0x18300000)
从空间 640K,使用 74% [0x183a0000,0x184173e8,0x18440000)
到空间 640K,使用 0% [0x18300000,0x18300000,0x183a0000)
PSOldGen 总计 6272K,已使用 4627K [0x0ba20000, 0x0c040000, 0x18220000)
对象空间 6272K,已使用 73% [0x0ba20000,0x0bea4d70,0x0c040000)
PSPermGen 总计 32768K,使用了 12930K [0x03a20000, 0x05a20000, 0x0ba20000)
对象空间 32768K,已使用 39% [0x03a20000,0x046c0aa0,0x05a20000)
71908.146: [GC [PSYoungGen: 1372K->533K(1536K)] 6000K->5423K(7808K), 0.0107964 秒]
gc 调用后堆=23195:
PSYoungGen 总计 1536K,已使用 533K [0x18220000, 0x18460000, 0x24a20000)
伊甸园空间 896K,已使用 0% [0x18220000,0x18220000,0x18300000)
从空间 640K,使用 83% [0x18300000,0x18385438,0x183a0000)
到空间 704K,使用 0% [0x183b0000,0x183b0000,0x18460000)
PSOldGen 总计 6272K,已使用 4890K [0x0ba20000, 0x0c040000, 0x18220000)
对象空间 6272K,已使用 77% [0x0ba20000,0x0bee6868,0x0c040000)
PSPermGen 总计 32768K,使用了 12930K [0x03a20000, 0x05a20000, 0x0ba20000)
对象空间 32768K,已使用 39% [0x03a20000,0x046c0aa0,0x05a20000)
}
使用的(相关)JVM参数如下:
-服务器
-Xms600m
-Xss256k
-XX:+UseParallelGC
-XX:+PrintHeapAtGC
-XX:+HeapDumpOnOutOfMemoryError
-Xloggc:verbose_gc.log
-Djavax.net.debug=none
-XX:+PrintGCDetails
-XX:+PrintTenuringDistribution
-XX:+PrintClassHistogram
-Xmx800m
-XX:NewRatio=1
-XX:CompileThreshold=1500
-XX:PermSize=32m
-XX:MaxPermSize=128m
当使用可视 vm (the年轻一代和老一代人满了)。
对这种行为有什么解释吗?
更新#1: 更正和更新: 上面的示例应用程序还包括一个与每个线程一起创建的数组对象。数组大小是总堆的重要部分。 该问题在 JDK 1.5 中很明显。
-R
【问题讨论】:
标签: java memory garbage-collection heap-memory stack-memory