JVM内存溢出的两大类型及解决方案

http://java.chinaitlab.com/Jvm/906465.html html


一、java.lang.OutOfMemoryError:PermGenspacejava

JVM管理两种类型的Java内存,堆和非堆。堆是给开发人员用的上面说的就是,是在JVM启动时建立;非堆是留给JVM本身用的,用来存放类的信息的。它和堆不一样,运行期内GC不会释放空间。若是webapp用了大量的第三方jar或者应用有太多的class文件而刚好MaxPermSize设置较小,超出了也会致使这块内存的占用过多形成JVM内存溢出,或者tomcat热部署时侯不会清理前面加载的环境,只会将context更改成新部署的,非堆存的内容就会愈来愈多。web

PermGenspace的全称是PermanentGenerationspace,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGenspace中,它和存放类实例(Instance)的Heap区域不一样,GC(GarbageCollection)不会在主程序运行期对PermGenspace进行清理,因此若是你的应用中有很CLASS的话,就极可能出现PermGenspace错误,这种错误常见在web服务器对JSP进行precompile的时候。若是你的WEBAPP下都用了大量的第三方jar,其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。tomcat

一个最佳的配置例子:(通过本人验证,自从用此配置以后,再未出现过tomcat死掉的状况)服务器

window->preferences->myeclipse->server->tomcat 6->jdk->optional java jvm arguments里加入参数app

1.setJAVA_OPTS=-Xms800meclipse

2.-Xmx800m-XX:PermSize=128Mwebapp

3.-XX:MaxNewSize=256mjvm

4.-XX:MaxPermSize=256mide

二、java.lang.OutOfMemoryError:Javaheapspace

再来看一下JVM内存溢出的第二种状况,第一种状况是个补充,主要存在问题就是出如今这个状况中。其默认空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4.若是内存剩余不到40%,JVM就会增大堆到Xmx设置的值,内存剩余超过70%,JVM就会减少堆到Xms设置的值。因此服务器的Xmx和Xms设置通常应该设置相同避免每次GC后都要调整虚拟机堆的大小。假设物理内存无限大,那么JVM内存的最大值跟操做系统有关,通常32位机是1.5g到3g之间,而64位的就不会有限制了。

注意:若是Xms超过了Xmx值,或者堆最大值和非堆最大值的总和超过了物理内存或者操做系统的最大限制都会引发服务器启动不起来。

垃圾回收GC的角色

JVM调用GC的频度仍是很高的,主要两种状况下进行垃圾回收:

当应用程序线程空闲;另外一个是java内存堆不足时,会不断调用GC,若连续回收都解决不了内存堆不足的问题时,就会报outofmemory错误。由于这个异常根据系统运行环境决定,因此没法预期它什么时候出现。根据GC的机制,程序的运行会引发系统运行环境的变化,增长GC的触发机会。

为了不这些问题,程序的设计和编写就应避免垃圾对象的内存占用和GC的开销。显示调用System.GC()只能建议JVM须要在内存中对垃圾对象进行回收,但不是必须立刻回收,一个是并不能解决内存资源耗空的局面,另外也会增长GC的消耗。

相关文章
相关标签/搜索