09-01
15
解决java.lang.OutOfMemoryError: PermGen space异常
作者:Java伴侣 日期:2009-01-15
这几天用netbeans启动tomcat的时候抛出了一个异常
网上找了找解决办法,问题产生的原因如下
分析Java虚拟机的运行时数据区一般分类如下(不一定是物理划分):
方法区可以简单的等价为所谓的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:
复制内容到剪贴板 程序代码
java.lang.OutOfMemoryError: PermGen space
网上找了找解决办法,问题产生的原因如下
分析Java虚拟机的运行时数据区一般分类如下(不一定是物理划分):
引用内容
1. 堆:主要存放对象实例,线程共享
2. 栈:主要存储特定线程的方法调用状态,线程独占
3. 本地方法栈:存储本地方法的调用状态,线程独占
4. PC寄存器:学过操作系统课程的都知道,线程独占
5. 方法区:主要存储了类型信息,线程共享
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 虚拟机
据说这个虚拟机性能非常高,有机会一定试试它
据说这个虚拟机性能非常高,有机会一定试试它
评论: 0 | 引用: 0 | 查看次数: 717
发表评论