09-01
15

解决java.lang.OutOfMemoryError: PermGen space异常

这几天用netbeans启动tomcat的时候抛出了一个异常



java.lang.OutOfMemoryError: PermGen space


网上找了找解决办法,问题产生的原因如下


  分析Java虚拟机的运行时数据区一般分类如下(不一定是物理划分):
引用内容 引用内容
1. 堆:主要存放对象实例,线程共享
2. 栈:主要存储特定线程的方法调用状态,线程独占
3. 本地方法栈:存储本地方法的调用状态,线程独占
4. PC寄存器:学过操作系统课程的都知道,线程独占
5. 方法区:主要存储了类型信息,线程共享  


方法区可以简单的等价为所谓的PermGen区域(永久存储区),在很多虚拟机相关的文档中,也将其称之为"永久堆"(permanent heap),作为堆空间的一部分存在,这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,由不同的类加载器实例加载的类型可以等价为完全不同的类型,哪怕时同一类型类加载器的不同实例加载的,都会在PermGen区域分配相应的空间来存储类型信息,新类型加载时,会在PermGen区域申请相应的空间来存储类型信息,类型被卸载后,PermGen区域上的垃圾收集会释放对应的内存空间。但一般情况下,应用运行时很少去卸载,因为只有该类型的类加载器完全不被使用的时候才会卸载,所以如果APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。

-Xmx:堆内存最大值 解决# 为PermGen区域分配的堆空间过小,可以通过合理的设置-XX: PermSize参数和-XX:MaxPermSize参数来解决。
          如 : java -Xms256m -Xmx256m -XX:PermSize=128m -XX:MaxPermSize=256m Test.class
可以针对自己应用占用的内存大小来设定,PermSize为永久堆的初始默认值,MaxPermSize为最大值,也就是峰值


解决办法有两个
方法1:通过为jvm设置启动参数可以解决这个问题,设置如下


-XX:PermSize=128m -XX:MaxPermSize=256m


方法2:
换用bea的 JRokit 虚拟机
据说这个虚拟机性能非常高,有机会一定试试它


文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: PermGen space
相关日志:
评论: 0 | 引用: 0 | 查看次数: 717
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭