2

我知道关于这个问题有很多 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

4 回答 4

4

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

于 2013-03-22T19:18:41.907 回答
2

问题似乎出在 jsp 本身。我猜它正在用类填充 PermGen。能发一下jsp代码吗?

添加内存不是解决此问题的方法。有一些东西在里面,你需要找到那个东西。

于 2013-03-19T20:32:48.813 回答
1

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

2) 考虑增加-Xmx并没有什么坏处。

3)这里有一些很好的链接:

4) 最重要的是在您的应用程序运行时对其进行分析,以查看您是否可以准确地弄清楚是什么在消耗您的 PermGen。以下是一些选项:

于 2013-03-19T20:37:24.030 回答
1

也许我错了,但这个问题似乎与 Jasper 的错误使用有关……您是否调查了OutOfMemoryError: PermGen Space -- Jasper Report with Spring 在 Tomcat 上运行的公认原因?

于 2013-03-19T21:03:17.483 回答