java.lang.OutOfMemoryError:PermGen空间

java.lang.OutOfMemoryError:PermGen空间,java,eclipse,tomcat,heap,Java,Eclipse,Tomcat,Heap,对所有不支持/不支持的选民:我知道这是许多问题的完全重复,但我尝试了许多答案,仍然面临问题,因此添加了一个新问题 问题: 我将EclipseHelios和Tomcat6用于我的spring应用程序,并获得 java.lang.OutOfMemoryError: PermGen space 每当我调试应用程序时 我试过了 1) 添加 到eclipse.ini 2) 在tomcat_home/bin中创建setenv.sh和setenv.bat set JAVA_OPTS="-Xms256m

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

问题: 我将EclipseHelios和Tomcat6用于我的spring应用程序,并获得

java.lang.OutOfMemoryError: PermGen space  
每当我调试应用程序时

我试过了
1) 添加

到eclipse.ini
2) 在
tomcat_home/bin
中创建
setenv.sh
setenv.bat

set JAVA_OPTS="-Xms256m -Xmx512m -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled"   
3) 在eclipse中手动运行垃圾收集器。我通过以下方式启用了此选项:

Window -> Preferences -> General -> and select always run in background and show heap status 
4) 重新启动Tomcat一百次。
5) 重新启动eclipse,有时在挫折超过限制时重新启动我的机器。
最棒的是我仍然得到了错误。
有什么解决办法我应该试试吗

编辑:
我尝试运行其他应用程序,但仍然收到相同的错误,因为我的应用程序太小,无法引起错误,并且我的应用程序在我的同事的安装程序中运行良好。

Try
set JAVA\u OPTS=-XX:NewSize=128m-XX:MaxNewSize=256m-XX:PermSize=128m-XX:MaxPermSize=256m-XX:+DisableExplicitGC-Xms512m-Xmx1536m

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


您使用了哪些工具来评测正在运行的应用程序?我建议使用EclipseMat,尽管jdk中有jconsole和visualvm。 您是否在应用程序中的某个循环中加载了很多类? 弦呢?字符串池的大小是多少?
很抱歉,重新启动tomcat、eclipse或机器无法解决问题;您需要分析您的应用程序以解决此问题。获取一个堆转储(您可以使用jmap)并进行分析。

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

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

此外,如果使用超过1GA的perm空间,我猜代码中可能有错误。 尝试定位perm空间消耗的来源并修复它。我不是说这会很容易,但是为了让应用程序正常工作,需要它。。。除非真的打算使用1GA的烫发空间,但我对此有些怀疑


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

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

理解EclipseWTP(在我的例子中是Indigo)提供的Tomcat插件并不调用外部(依赖于操作系统)脚本来启动/停止Tomcat,这一点很重要。相反,它们直接通过命令行(
java.exe…
)生成Tomcat JVM。如果您想修改Tomcat实例的JVM参数,则需要从eclipse中开始修改相应的
运行配置
。尝试在那里修改JVM参数,它应该可以工作(参见屏幕截图)。

对我来说
-Xmx1024m-XX:MaxPermSize=256m
成功了。

我知道这是许多问题的完全重复——我建议你对你想回答的问题悬赏,或者重新表述这个问题(提供具体细节等)所以它不是完全重复的。@Hyangelo:PermGen用完并不是简单的内存泄漏造成的。你混淆了JVM配置参数。问题是否发生在eclipse JVM(eclipse崩溃)或Tomcat JVM实例中?如果是后者,选项#1和#3不应该有任何影响,因为它们与eclipse IDE JVM实例相关。可能的重复-因为您没有按照那里的答案做所有事情。具体地说,增加tomcat@arnaud当前位置我知道这是一个愚蠢的问题,我真的是一个愚蠢的家伙,知道了之后才提出这个问题。我尝试了我在网上发现的任何东西,因为我没有足够的专家来检测愚蠢的错误。我将尝试更新我的知识。谢谢。我应该删除我刚才提到的-vmargs吗?我将其用于JBoss AS,并将其添加到启动脚本中(windows上的.bat和linux上的.sh)。它应该是JVM启动的一个参数,以便在tomcat启动脚本中将其添加到JAVA_OPTS中。垃圾收集器未清除Perm gen空间
-这是不正确的,并且仅在默认配置下的CMS收集器中是正确的。我已更正,只要在这里读一读,然后把它从我的帖子中删除,作为建议。我保持我的堆和永久大小为512。“eclipse配置和tomcat配置不匹配”的确切含义是什么?您的tomcat
JAVA\u OPTS
的最小/最大堆、perm size和GC策略的值与您的
eclipse.ini
config不同。@Ajinkya:您是否尝试过将-XX:MaxPermSize=512m放入运行/de
Window -> Preferences -> General -> and select always run in background and show heap status