2012-02-20 55 views
0

我已经部署了一个非常大的应用程序,当我试图启动它给的PermGen空间错误

“内存不足错误”服务器:PermGen的空间

由于正在使用Tomcat 5.5,我在bin文件夹中没有“setenv.bat”。所以我已经设置了“catalina.bat”中的JAVA_OPTS。我给了喜欢。

set JAVA_OPTS=-server -Xms512m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=512m -XX:NewSize=192m -XX:MaxNewSize=384m -Djava.awt.headless=true -Dhttp.agent=Sakai -Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false -Dsun.lang.ClassLoader.allowArraySyntax=true 

但仍存在问题。有什么我需要指定或需要改变在上面的片段,以便我的服务器将上升。

谢谢, Jeyaa。

+0

首先,将VisualVM附加到此过程并观察堆和非堆内存如何增长。你会知道如果512Mo确实被允许到你的Tomcat,那么你将不得不找到为什么... – Grooveek 2012-02-20 10:36:51

+0

我有一个类似的问题。有没有什么简单的方法可以用jvisualvm或其他工具查看classloader泄漏? – 2012-02-20 11:05:12

回答

0

如果您使用的是Sun JVM,最好的方法是下载Visual VM 1.3.3并安装所有插件。它会让你看到线程,内存等。

首先启动Visual VM,然后通过在Visual VM中选择其JRE来启动Tomcat。您将能够看到发生了什么。

那里有很多的记忆。你必须在代码中做一些事情才能做到这一点。

0

我建议你使用的工具JVisualVM其中包括Java中的热点分布来检查你的PermGen空间大小,并期待在GC统计

0

尝试MaxPermSize参数与-XX:MaxPermSize=1024m翻一番。如果问题仍然存在,那么还可以尝试使用-XX:+HeapDumpOnOutOfMemoryError标志在OutOfMemoryError上启用堆转储,然后使用Eclipse Memory Analyser打开内存转储以找出占用所有内存的内容。记忆倾销需要很长时间,所以要耐心等待。这可能是因为你有泄漏需要堵塞。例如,类无休止地生成,或者大量的字符串是intern'ed。

我曾经有过内存泄漏,因为我从动态生成的字符串中创建了Log4J记录器,结果发现Log4J拦截了所有这些字符串。这意味着运行3天后,我们的程序在PermGen空间中与OOM崩溃。不好。

0

由于要部署酒井,这些JAVA_OPTS应该是所有你需要一个小的安装,因为他们是什么我已经使用了很多年:

-server -XX:+ UseParallelGC -XX -Xmx1024m :PermSize = 512m -XX:MaxPermSize = 512m -Djava.awt.headless = true -Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING = false -Dsun.lang.ClassLoader.allowArraySyntax = true -Dhttp.agent = Sakai

请注意,您希望针对您的特定问题想要增加PermSize设置。