2

一位同事在Eclipse/Tomcat运行参数中有如下设置,一直抱怨堆内存不足:

-XX:PermSize=512M
-XX:MaxPermSize=1024M
-Xmx1024m

如果我理解正确的话,max PermGenmax Heap都是 1 GB。由于PermGen是堆的特殊部分,这相当于将所有堆分配给PermGen. 这个对吗?

Perm Space vs Heap Space,我可能是对的。这会导致问题吗?

Per Is Java PermGen Space Part of Total VM Memory,我的理解是不正确的。

4

2 回答 2

3

你说的对。>512MB 用于 PermGen,<512MB 用于堆

使用任何 Sun/Oracle JVM 附带的 JVisualVM 连接到正在运行的 eclipse 进程并检查实际情况

于 2013-05-23T22:09:45.837 回答
2

启用 GC 日志记录,一旦 Eclipse 再次崩溃,您将看到问题的原因,日志将显示 PermGen 的大小。

GC 日志记录:-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log -XX:+HeapDumpOnOutOfMemoryError -Xloggc:gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -showversion

考虑到 PermGen 是否是堆的一部分,这实际上取决于您正在运行的 Hotspot 的版本。GC 算法控制 PermGen 的大小,因此即使您设置 MAX=1GB,它也可能永远不会增长到那么大,并且由于某些其他问题您仍然可以得到 OOM。

于 2013-05-24T00:12:08.710 回答