部署Tomcat 7时出现PermGen Space错误?

19

我安装了Tomcat 7,以将我的JIRA项目版本从5.0升级到6。将项目文件夹放置在Tomcat的webapps中后,我运行了localhost:8080/jira,在长时间运行后,它抛出了一些错误信息。请帮我们解决这个问题,谢谢。

java.lang.RuntimeException: PermGen space
    at com.atlassian.event.internal.SingleParameterMethodListenerInvoker.invoke(SingleParameterMethodListenerInvoker.java:54)
    at com.atlassian.event.internal.AsynchronousAbleEventDispatcher$2.run(AsynchronousAbleEventDispatcher.java:66)
    at com.atlassian.event.internal.AsynchronousAbleEventDispatcher$1.execute(AsynchronousAbleEventDispatcher.java:32)
    at com.atlassian.event.internal.AsynchronousAbleEventDispatcher.dispatch(AsynchronousAbleEventDispatcher.java:60)
    at com.atlassian.event.internal.EventPublisherImpl.invokeListeners(EventPublisherImpl.java:160)
    at com.atlassian.event.internal.EventPublisherImpl.publish(EventPublisherImpl.java:79)
    at com.atlassian.plugin.event.impl.DefaultPluginEventManager.broadcast(DefaultPluginEventManager.java:84)
    at com.atlassian.plugin.manager.DefaultPluginManager.addPlugins(DefaultPluginManager.java:768)
    at com.atlassian.plugin.manager.DefaultPluginManager.init(DefaultPluginManager.java:200)
    at com.atlassian.jira.plugin.JiraPluginManager.start(JiraPluginManager.java:63)
    at com.atlassian.jira.ComponentManager$PluginSystem.start(ComponentManager.java:635)
    at com.atlassian.jira.ComponentManager.startJIRA(ComponentManager.java:214)
    at com.atlassian.jira.ComponentManager.quickStart(ComponentManager.java:208)
    at com.atlassian.jira.ComponentManager.start(ComponentManager.java:193)
    at com.atlassian.jira.upgrade.PluginSystemLauncher.start(PluginSystemLauncher.java:23)
    at com.atlassian.jira.startup.DefaultJiraLauncher$3.run(DefaultJiraLauncher.java:107)
    at com.atlassian.jira.config.database.DatabaseConfigurationManagerImpl.doNowOrEnqueue(DatabaseConfigurationManagerImpl.java:323)
    at com.atlassian.jira.config.database.DatabaseConfigurationManagerImpl.doNowOrWhenDatabaseActivated(DatabaseConfigurationManagerImpl.java:211)
    at com.atlassian.jira.startup.DefaultJiraLauncher.postDbLaunch(DefaultJiraLauncher.java:100)
    at com.atlassian.jira.startup.DefaultJiraLauncher.access$100(DefaultJiraLauncher.java:27)
    at com.atlassian.jira.startup.DefaultJiraLauncher$1.run(DefaultJiraLauncher.java:66)
    at com.atlassian.jira.util.devspeed.JiraDevSpeedTimer.run(JiraDevSpeedTimer.java:33)
    at com.atlassian.jira.startup.DefaultJiraLauncher.start(DefaultJiraLauncher.java:61)
    at com.atlassian.jira.startup.LauncherContextListener.contextInitialized(LauncherContextListener.java:54)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4797)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5291)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
    at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:657)
    at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1637)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.OutOfMemoryError: PermGen space

请查看这个答案,了解如何增加permgen空间。但是,如果存在真正的潜在permgen空间占用问题,这可能只是延长痛苦的方法... - Anders R. Bystrup
我们在环境变量中设置了CATALINA_OPTS = -Xms512m -Xmx1024m。并且还增加了位于Tomcat 7的bin文件夹中的tomcat7w中的内存大小。请告诉我在哪里更改内存以及如何获得结果。感谢您的支持 :) - Maharajan
3个回答

41

更加有用的解决方案是增加JAVA_OPTS变量中的值。
bin目录下的Catalina.bat/Catalina.sh文件中添加以下行:

对于Windows系统(Catalina.bat)

set JAVA_OPTS="-Xms1024m -Xmx10246m -XX:NewSize=256m -XX:MaxNewSize=356m -XX:PermSize=256m -XX:MaxPermSize=356m"  

对于Unix系统(Catalina.sh)

export JAVA_OPTS="-Xms1024m -Xmx1024m -XX:NewSize=256m -XX:MaxNewSize=356m -XX:PermSize=256m -XX:MaxPermSize=356m"  

你可以在这篇文章中找到更多的解决方案。


10
在 setenv.sh/.bat 中设置这些导出项会使其更清晰。请注意,我的翻译只针对原文的字面意思,不涉及任何解释或额外信息。 - user18428
根据您的指示,我已更改了catalina.bat文件中的值。那么请问是否有其他方法可以解决这个问题? - Maharajan
我仍然遇到“ERROR: Bundle org.springframework.osgi.extender [7] EventDispatcher: Error during dispatch. (java.lang.OutOfMemoryError: PermGen space)”的错误。 - Maharajan
2
+1 如果提到了 catalina.bat - Withheld

12

有时候重新部署后,垃圾回收器无法销毁Tomcat上的某些对象并且会耗尽空间。这种情况有很多原因:

  • 如果您使用一些CRUD对象,请检查是否在使用后全部关闭。
  • 如果您的应用程序使用其他库,有时也无法销毁这些库中的对象,例如MysqlConnector、Hibernate/C3p0或其他库 - 尝试将这些库放在tomcat/lib文件夹中。

使用“Java VisualVM”检查Tomcat,并在重新部署后检查permGen。
permGen空间的默认值通常也很低,您可以使用以下javaVM参数来增加它们:

 -XX:PermSize=64M -XX:MaxPermSize=256m
您可以按照这个教程进行操作:
http://www.mkyong.com/tomcat/tomcat-javalangoutofmemoryerror-permgen-space/

更新:
这里可能还有其他解决方案:what to do with tomcat PermGen space,请将 -XX:+CMSClassUnloadingEnabled 和 -XX:+UseConcMarkSweepGC 加入 javaVM 选项中。

按照上述网站的说明操作后,仍然出现相同的错误。我正在使用Windows服务器。因此,我更改了catalina.bat文件中的值。请问是否有其他方法可以解决这个问题?注意:我正在使用Windows服务器。 - Maharajan
仍然出现错误:Bundle org.springframework.osgi.extender [7] EventDispatcher: Error during dispatch. (java.lang.OutOfMemoryError: PermGen space) - Maharajan
1
你在重新部署后是否使用JavaVisualVm检查了Tomcat的堆和PermGen空间?http://visualvm.java.net/ - Zelldon
我们正在本地机器上工作。 - Maharajan
没问题...我也在本地机器上工作,使用 Java Visual VM 找到了问题。 - Zelldon
我有另一种解决方案可能会有用:在此处找到:https://dev59.com/Q2kw5IYBdhLWcg3wKneb。-XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC - Zelldon

1
使用JAVA_OPTS变量通过-XX:PermSize={value}-XX:MaxPermSize={value}调整permgen的值,其中'value'是类似于256m的字符串。请注意保留html标签。

我们在环境变量中设置了CATALINA_OPTS = -Xms512m -Xmx1024m。同时,我们还需要增加位于Tomcat 7的bin文件夹中的tomcat7w的内存大小。请帮助我找到需要更改内存的位置,并告诉我如何获得结果。感谢您的支持 :) - Maharajan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接