如何处理tomcat PermGen空间

时间:2012-04-10 07:48:36

标签: java tomcat permgen

背景:我有一个使用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)

7 个答案:

答案 0 :(得分:34)

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

解决方案:允许Java将类定义从内存中取出,即垃圾收集字节代码。添加这些以及增加的permgen大小:

-XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC

答案 1 :(得分:13)

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

答案 2 :(得分:6)

FOR ECLIPSE

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

    1. 转到Netbeans文件夹/ etc /
    2. 在任何编辑器中打开netbeans.config
    3. 将此行编辑为
    4. 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 = true -J-Dsun.java2d.noddraw = true -J-Dsun.java2d.dpiaware = true -J-Dsun.zip.disableMemoryMapping = true“

      多数人

答案 3 :(得分:5)

设置如下:

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

enter image description here

答案 4 :(得分:1)

只是为Windows添加,如果有人仍然卡住: -

  1. 打开catalina.bat文件(位于Apache tomcat安装文件夹/ bin)
  2. 在一开始就设置JAVA_OPTS(实际上它首次在文件中的任何地方使用之前): -

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

  3. 重启Tomcat及其完成。

  4. 你可以找到很好的解释here

答案 5 :(得分:1)

只需从apache tomcat界面进行配置:

  1. 启动C:\ Program Files \ Apache Software Foundation \ Tomcat 8.5 \ bin \ Tomcat8w.exe(或者您可以只在Windows start中搜索“ Configure Tomcat”);
  2. 转到Java标签;
  3. 在输入字段中设置所需的空间: enter image description here

答案 6 :(得分:0)

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

因此,将$("#yeartext").html(data.years_array); 添加到-XX:MaxPermSize=512m将有助于解决此问题。按照以下步骤将其添加到tomcat服务器:

  • 在eclipse中双击服务器

  • 打开启动配置

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