虚拟机内存溢出java.lang.OutOfMemoryError: PermGen space

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhou920786312/article/details/79977402

PermGen space的全称是Permanent Generation space,
是指内存的永久保存区域。
这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。
异常情况
1如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
2这个异常和JVM默认划分的内存上限是128M有关,如果你的业务足够繁忙,128M是远远不够的,所以你可以给JVM分配上1G甚至更多,这样就可以避免内存溢出。
解决方法:

手动设置MaxPermSize大小修改
TOMCAT_HOME/bin/catalina.sh
在“echo “Using CATALINA_BASE: $CATALINA_BASE””上面加入以下行:
JAVA_OPTS=”-server -XX:PermSize=64M -XX:MaxPermSize=128m

if [ $have_tty -eq 1 ]; then
 JAVA_OPTS="-server -XX:PermSize=256M -XX:MaxPermSize=1024m"
  echo "Using CATALINA_BASE:   $CATALINA_BASE"
  echo "Using CATALINA_HOME:   $CATALINA_HOME"
  echo "Using CATALINA_TMPDIR: $CATALINA_TMPDIR"

-XX:PermSize:设定内存的永久保存区域
-XX:MaxPermSize:设定最大内存的永久保存区域

内存设置资料

一般的ini文件设置主要包括以下几项:
-vmargs
-Xms40m
-Xmx256m
-XX:PermSize=64M
-XX:MaxPermSize=128M
以下解释其意思。
-vmargs:说明后面是VM的参数
-Xms40m:虚拟机占用系统的最小内存
-Xmx256m:虚拟机占用系统的最大内存
-XX:PermSize:最小堆大小。一般报内存不足时,都是说这个太小,
                       堆空间剩余小于5%就会警告,建议把这个稍微设
                               大一点,不过要视自己机器内存大小来设置
-XX:MaxPermSize:最大堆大小。这个也适当大些
     所以若出现问题,首先请调整 -Xms40m:将其设置的小一些,就ok了,

1g内存推荐设置为:
-vmargs
-Xms128M
-Xmx512M
-XX:PermSize=256M
-XX:MaxPermSize=512M
其中-XX:PermSize=64M可以设置大一些,但不能超过MaxPermSize
-Xmx512M5%为25.6M,理论上要求-Xmx的数值与-XX:MaxPermSize必须大于25.6M
阅读更多

内存溢出java.lang.OutOfMemoryError: PermGen space

04-11

各位大神,在myeclipse中发布一个项目运行起来开始是没有报错的,今天突然就报了这个错,也不知道是不是动了哪个地方导致的,现在已启动tomcat,访问地址就会报这个错,google了一下说是内存溢出,需要设置JAVA_OPTS,可是我找不到在哪配置啊,还请大神指点。。。。rnrnjava.lang.OutOfMemoryError: PermGen spacern at java.lang.ClassLoader.defineClass1(Native Method)rn at java.lang.ClassLoader.defineClass(ClassLoader.java:621)rn at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)rn at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)rn at java.net.URLClassLoader.access$000(URLClassLoader.java:56)rn at java.net.URLClassLoader$1.run(URLClassLoader.java:195)rn at java.security.AccessController.doPrivileged(Native Method)rn at java.net.URLClassLoader.findClass(URLClassLoader.java:188)rn at java.lang.ClassLoader.loadClass(ClassLoader.java:307)rn at java.lang.ClassLoader.loadClass(ClassLoader.java:252)rn at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)rn at java.lang.ClassLoader.defineClass1(Native Method)rn at java.lang.ClassLoader.defineClass(ClassLoader.java:621)rn at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)rn at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)rn at java.net.URLClassLoader.access$000(URLClassLoader.java:56)rn at java.net.URLClassLoader$1.run(URLClassLoader.java:195)rn at java.security.AccessController.doPrivileged(Native Method)rn at java.net.URLClassLoader.findClass(URLClassLoader.java:188)rn at java.lang.ClassLoader.loadClass(ClassLoader.java:307)rn at java.lang.ClassLoader.loadClass(ClassLoader.java:252)rn at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)rn at org.eclipse.jdt.internal.compiler.parser.Parser.createJavadocParser(Parser.java:8396)rn at org.eclipse.jdt.internal.compiler.parser.Parser.(Parser.java:889)rn at org.eclipse.jdt.internal.compiler.Compiler.initializeParser(Compiler.java:685)rn at org.eclipse.jdt.internal.compiler.Compiler.(Compiler.java:283)rn at org.eclipse.jdt.internal.compiler.Compiler.(Compiler.java:159)rn at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:423)rn at org.apache.jasper.compiler.Compiler.compile(Compiler.java:356)rn at org.apache.jasper.compiler.Compiler.compile(Compiler.java:334)rn at org.apache.jasper.compiler.Compiler.compile(Compiler.java:321)rn at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:592)rn

跪求:内存溢出java.lang.OutOfMemoryError: PermGen space

07-09

各位前辈、各位高手:rnrn 我最近做了一个小项目(通讯录),是用Struts+Hibernate+Spring写的;rnrn 运行环境、jdk1.5.0 + TomCat5.5.17 + mySql4.1.20rnrn 开发工具、 eclipse-SDK-3.1.2-win32.zip + EnterpriseWorkbenchInstaller_4.1.1GA_E3.1.exe(myEclipse)rnrn   该程序在本地测试和编译均能通过、但不管是在本地还放到电信机房服务器处运行时间一长(尤其是不停的操作和使用这个系统),就会报 java.lang.OutOfMemoryError: PermGen space 这个错误;rnrn 争对 java.lang.OutOfMemoryError: PermGen space 这个问题、baidu、google、Csdn.net我都找过相关的解决方法,似乎所有提供的解决方法、都无济于事;rnrn 另一个项目(客户管理系统)、是用 Struts+Hibernate 开发的;也存在这个问题、这几天我公司销售人员正在用这个系统、我采取的办法一但在TomCat日志中出现在 java.lang.OutOfMemoryError 错误、我便重启一次Tomcat;rnrn 请提供思路解决;rnrn 补充、有人提出、我的Session没有及时关闭、我的数据库连接没有及时关闭;但把整个项目打包发给几个写Java程序的朋友、他们大多数看过之后,认为程序没有多大问题(当然这是他们的意见,还需各位前辈在百忙之中、牺牲一点你们时间,帮帮我分析及提供解决思路);rnrn 我的QQ:544588699、MSN:renwei0905@msn.com

没有更多推荐了,返回首页