OutOfMemoryError:PermGen空间

时间:2013-03-19 20:28:34

标签: java memory spring-tool-suite

我知道在这个问题上有很多SO问题和答案;我尝试了8或10种不同的东西,对其他人有效,并且需要分析错误而不是试错。

我在Windows 64位计算机,Spring Tool Suite 3.1,Jetty内部服务器上运行。我正在运行一个Web应用程序;它的初始屏幕出现,我点击一个执行操作的链接,它处理大概10秒,然后给我以下

HTTP ERROR 500
Problem accessing /corrserv/printRoom/printManagement.html;jsessionid=uroykwoyxr2y.     
Reason: 

PermGen space

Caused by:
java.lang.OutOfMemoryError: PermGen space
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClassFromSelf(ClassRealm.java:386)
at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:42)
at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:244)
at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:230)
at org.eclipse.jdt.internal.compiler.Compiler.<init>(Compiler.java:109)
at org.apache.jasper.compiler.JDTJavaCompiler.compile(JDTJavaCompiler.java:498)
at org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:368)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:437)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:608)
at org.apache.jasper.servlet.JspServletWrapper.loadTagFile(JspServletWrapper.java:261)
at org.apache.jasper.compiler.TagFileProcessor.loadTagFile(TagFileProcessor.java:683)
at org.apache.jasper.compiler.TagFileProcessor.access$000(TagFileProcessor.java:88)
at org.apache.jasper.compiler.TagFileProcessor$TagFileLoaderVisitor.visit(TagFileProcessor.java:739)
at org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1501)
at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2291)
at org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2341)
at org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2347)
at org.apache.jasper.compiler.Node$Root.accept(Node.java:498)
at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2291)
at org.apache.jasper.compiler.TagFileProcessor.loadTagFiles(TagFileProcessor.java:757)
at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:222)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:435)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:608)


--------------------------------------------------------------------------------
Powered by Jetty://

以下是我的STS.ini文件:

-vm
C:/Program Files (x86)/Java/jdk1.6.0_43/bin/javaw.exe
-startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.200.v20120522-1813
-product
org.springsource.sts.ide
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
512m
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms256m
-Xmx512m
-XX:MaxPermSize=512m

我为最后三个值尝试了很多东西。我已输入123456789m以确保STS读取此特定文件(它不会以该值开头)。我只运行一个Web应用程序。我以前也有-XX:PermSize,很乐意再试一次。不幸的是,我不知道这些是如何相互作用的;只是他们的基本含义。

我希望得到一些关于如何解决这个问题的指导,或者至少如何解决它。

4 个答案:

答案 0 :(得分:4)

这可以通过查看JDK的版本(位版本)来解决。就像使用64位JDK版本的32位应用程序一样。更改为正确的JDK版本和正确的JRE。

答案 1 :(得分:2)

问题似乎出在jsp本身。我猜它会用类填满PermGen。你可以发布jsp代码吗?

添加内存不是解决此问题的方法。有一些东西填补它,你需要找到一些东西。

答案 2 :(得分:1)

1)限制 MaxPermSize到512m可能不是一个好主意。我肯定会把它拿出来。

2)考虑增加 -Xmx。

是不会有害的

3)以下是一些很好的链接:

4)最重要的是在你的应用运行时对其进行分析,看看你是否能够准确找出消耗你的PermGen的内容。以下是一些选项:

答案 3 :(得分:1)

也许我错了,但问题似乎与Jasper的错误使用有关......你有没有调查过OutOfMemoryError: PermGen Space -- Jasper Report with Spring running on Tomcat的原因?