27

背景:我有一个使用 JSP 的 web 项目。IDE 是 Eclipse。tomcat的配置是:资源变化时自动发布,发布间隔为“1秒”。

classes 文件夹中的一个属性文件,用于保存一些设置。它也可以由 servlet 动态修改。修改操作由 JSP 中的保存按钮触发。

问题:经过多次保存操作,Tomcat 自带java.lang.OutOfMemoryError: PermGen space.

日志信息

java.lang.OutOfMemoryError: PermGen space
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1815)
    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:872)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1325)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204)
    at org.apache.catalina.startup.WebAnnotationSet.loadApplicationServletAnnotations(WebAnnotationSet.java:108)
    at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:58)
    at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:297)
    at org.apache.catalina.startup.ContextConfig.start(ContextConfig.java:1064)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:261)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4238)
    at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3083)
    at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:404)
    at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1279)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1571)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1580)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1580)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1560)
    at java.lang.Thread.run(Thread.java:662)
4

7 回答 7

34

Tomcat 确实需要很多 permgen。512m不是一个不合理的最大值。但是,它只会延迟热部署泄漏。Permgen 每次 hotdeploy 会增长约 25mb,在 Eclipse 中,可能是每次保存 Java 文件时。如果你像我一样有 Ctrl+S 抽搐,512m 消失得很快。

解决方案:允许Java 将类定义踢出内存,即垃圾收集字节码。将这些与提升的 permgen 大小一起添加:

-XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC
于 2012-04-20T15:18:20.063 回答
15

您可以设置名为:“ JAVA_OPTS”的环境变量并设置它的值如下-Xms256m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m

于 2012-04-10T08:52:52.383 回答
6

对于日食

  1. 转到服务器属性
  2. 前往平台
  3. 现在在 VM 参数中写这个 -Xms256m -Xmx256m -XX:PermSize=256m -XX:MaxPermSize=512m

对于 NETBeans

  1. 转到 Netbeans 文件夹/etc/
  2. 在任何编辑器中打开 netbeans.config
  3. 将此行编辑为

netbeans_default_options="-J-client -J-Xss256m -J-Xms256m -J-XX:PermSize=256m -XX:MaxPermSize=512m -J-Dapple.laf.useScreenMenuBar=true -J-Dapple.awt.graphics.UseQuartz=真-J-Dsun.java2d.noddraw=真-J-Dsun.java2d.dpiaware=真-J-Dsun.zip.disableMemoryMapping=真"

就这样

于 2016-06-17T05:25:15.380 回答
5

像这样设置:

-Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m

在此处输入图像描述

于 2015-07-16T02:48:37.790 回答
3

只需从 apache tomcat 界面配置它:

  1. start C:\Program Files\Apache Software Foundation\Tomcat 8.5\bin\Tomcat8w.exe (或者你可以在 windows start 中搜索“Configure Tomcat”);
  2. 转到 Java 选项卡;
  3. 在输入字段中设置所需的空间: 在此处输入图像描述
于 2018-08-30T12:10:42.560 回答
1

Just to add for Windows, if someone is still stuck:--

  1. Open catalina.bat file (located at Apache tomcat installation folder/bin)
  2. Set JAVA_OPTS as follows in the very start(before actually its first use anywhere in the file):--

    set JAVA_OPTS=-Dfile.encoding=UTF-8 -Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m

  3. Restart Tomcat and its done.

You can find nice explanation here

于 2016-12-02T00:40:08.333 回答
0

Tomcat 服务器运行不同的 JAVA,而 eclipse 运行在不同的 JAVA 中。

所以添加-XX:MaxPermSize=512meclipse.ini将有助于解决这个问题。按照以下步骤将其添加到 tomcat 服务器:

  • 在eclipse中双击服务器

  • 打开启动配置

  • 在“参数”选项卡中将“-XX:MaxPermSize=512m”添加到 VM 参数。

于 2016-04-07T10:14:36.650 回答