在一个电商项目的一个项目修改页面里修改页面总是报OOM错误。里面主要有一些PRC调用,和要把图片从服务器下载下来的函数,具体为甚么要下载图片不知道,感觉多此一举。出现错误开始只是调了下 —Xmx -Xms —Xmn -Xss 这些参数但是并没有效果。后来发现是对于堆和非堆内存理解不对。所以调参有误。
Jvm 关于oom permSize space
Idea 错误如下:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000006da14f69, pid=19304, tid=15924
#
# JRE version: 6.0_45-b06
# Java VM: Java HotSpot(TM) 64-Bit Server VM (20.45-b01 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# V [jvm.dll+0x134f69]
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#
查看日志
发现堆的使用情况如下:
Heap
PSYoungGen total 955456K, used 5772K [0x00000007c1800000, 0x0000000800000000, 0x0000000800000000)
eden space 890624K, 0% used [0x00000007c1800000,0x00000007c1da3380,0x00000007f7dc0000)
from space 64832K, 0% used [0x00000007f7dc0000,0x00000007f7dc0000,0x00000007fbd10000)
to space 61248K, 0% used [0x00000007fc430000,0x00000007fc430000,0x0000000800000000)
PSOldGen total 1073088K, used 66795K [0x0000000780000000, 0x00000007c17f0000, 0x00000007c1800000)
object space 1073088K, 6% used [0x0000000780000000,0x000000078413ac38,0x00000007c17f0000)
PSPermGen total 83968K, used 83966K [0x000000077ae00000, 0x0000000780000000, 0x0000000780000000)
object space 83968K, 99% used [0x000000077ae00000,0x000000077ffff878,0x0000000780000000)
从中可以看出Heap中的剩余空间还是有很多的,但是PSPermGen持久代的内存已经用尽,所以在VMoption中加 —XX:permSize64m –XX:MaxPermSize 128M即可解决。这个两个参数代表的含义为非堆内存的大小和最大非堆内存大小。默认的时候就是物理内存的1/64、1/4;非堆内存就是jvm自己用的的内存,就是加载一些静态方法,类对象等数据。还有一个堆内存,就是平时我们用的的内存,一些实例对象放的地方,eden区和surver区等都属于堆内存。这里的的错误很明显是非堆内存溢出引起的。所以加大内存就行。
还有就是持久代(方法区)不属于堆的一部分。我这里用的的JDK是1.6版本的。因为当我把非堆内存加大超过堆内存并没有报错。这一点应该是可以说明问题的。