java.lang.OutOfMemoryError:PermGen空间

时间:2011-09-12 12:04:55

标签: java eclipse tomcat heap

对于所有关闭/关闭选民:我知道这是许多问题的完全重复,但我尝试了很多答案,但仍面临问题,因此添加了一个新问题。

问题: 我正在使用eclipse-helios和Tomcat 6作为我的春季应用程序并获得

java.lang.OutOfMemoryError: PermGen space  

无论我如何调试我的申请

我试过了 1)添加

-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms512m
-Xmx1024m
-XX:MaxPermSize=1204m
-XX:+UseConcMarkSweepGC
-XX:+CMSClassUnloadingEnabled
-XX:+CMSPermGenSweepingEnabled    

eclipse.ini
2)使用以下内容在setenv.sh中创建setenv.battomcat_home/bin

set JAVA_OPTS="-Xms256m -Xmx512m -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled"   

3)在日食中手动运行垃圾收集器。我通过

启用了此选项
Window -> Preferences -> General -> and select always run in background and show heap status 

4)重启Tomcat一百次 5)当挫折超出限制时重新启动eclipse并有时重启我的机器。
最好的部分是我仍然得到错误 我有什么办法可以尝试吗?

编辑: 我尝试运行其他应用程序,但仍然得到相同的错误恕我直言我的应用程序太小,不会导致错误,我的应用程序在我的同事设置上正常运行。

6 个答案:

答案 0 :(得分:25)

您的前3个选项针对2个不同的JVM。选项#1和#3修改eclipse JVM实例,这是管理IDE的JVM。选项#2修改Tomcat JVM实例。这就是为什么在启动eclipse和Tomcat时假设你的任务管理器中有两个java.exe文件(如果是windows)(假设这些文件是唯一运行的Java应用程序)。

重要的是要了解eclipse WTP(在我的案例中是Indigo)提供的Tomcat插件调用外部(OS相关)脚本来启动/停止Tomcat。相反,他们通过命令行(java.exe ...)直接生成Tomcat JVM。如果要修改Tomcat实例的JVM参数,请从eclipse中开始修改相应的Run Configuration。尝试修改那里的JVM参数,它应该工作(见截图)。 enter image description here

答案 1 :(得分:3)

尝试set JAVA_OPTS=-XX:NewSize=128m -XX:MaxNewSize=256m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:+DisableExplicitGC -Xms512m -Xmx1536m

  

永久代是特殊的,因为它成立   描述用户类的元数据(不属于该类的类)   Java语言)。这种元数据的示例是描述对象   类和方法,它们存储在Permanent Generation中。   具有大型代码库的应用程序可以快速填满这一部分   堆将导致java.lang.OutOfMemoryError:PermGen no   你的-Xmx有多高,以及你在机器上有多少内存。

答案 2 :(得分:0)

您使用了哪些工具来分析正在运行的应用程序?我建议使用eclipse mat,尽管jconk和visualvm可用于jdk。 你是否在一个循环中的某个地方加载了很多类? 字符串怎么样?字符串池的大小是多少? 对不起,重启tomcat,eclipse或者机器不会解决问题;您需要分析和分析您的应用程序以解决问题。进行堆转储(可以使用jmap)并进行分析。

答案 3 :(得分:0)

我会在JAVA_OPTS变量中添加-XX:PermSize = 1024m,因为错误可能来自Tomcat。 我不熟悉eclipse.ini文件。

答案 4 :(得分:0)

我不知道有关eclipse.ini的详细信息,但我只是在启动Eclipse本身时设置标志。不影响运行/调试应用程序。就个人而言,每当我想在运行/调试应用程序时更改设置时,我只需在相应的运行/调试配置中添加JVM标志。

此外,如果你使用超过1千兆的烫发空间,我想代码中有问题。 尝试找到烫发空间消耗的来源并修复它。我不是说这很容易,但是为了使应用程序正常工作,它将是必需的。 ......除非1 giga perm空间确实是有意的,但我对它有些怀疑。

您可以寻找的是string.intern()。如果你对每个请求/条目/任意字符串执行此操作,您将无用地填充您的perm空间,因为它将永久保留字符串的副本。

答案 5 :(得分:0)

对我来说 @foreach($data as $value) @if($value->name 'LIKE', '%' . $value->Name . '%') <th><a href="{{route('user.show',['id'=>$value->pi_id])}}"><span style="color: red;">{{$value->Name}}</span></a></th> @endif @endforeach 做了伎俩。