【问题标题】:what to do with tomcat PermGen space用tomcat PermGen空间做什么
【发布时间】:2012-04-22 12:34:11
【问题描述】:

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

【问题讨论】:

  • 请仔细阅读下面的文章,它完全解释了配置tomcat以增加permGen Tomcat PermGen Space
  • 每当人们在不重新启动 Tomcat 的情况下重复重新部署 Web 应用程序时,我都会在 Tomcat 中收到此错误。由于与类加载过程相关的泄漏,permgen 空间在每次重新部署时都会变得更满。增加 permgen 大小会延迟它耗尽内存的时间,但实际上,您需要确保 Tomcat 在重新部署 web 应用程序时被反弹。

标签: java tomcat permgen


【解决方案1】:

只需从 apache tomcat 界面配置即可:

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

【讨论】:

    【解决方案2】:

    只是为 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 并完成。

    你可以找到很好的解释here

    【讨论】:

      【解决方案3】:

      日食

      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=true -J-Dsun.java2d.noddraw=true -J-Dsun.java2d.dpiaware=true -J-Dsun.zip.disableMemoryMapping=true"

      就是这样

      【讨论】:

        【解决方案4】:

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

        因此,将-XX:MaxPermSize=512m 添加到eclipse.ini 将有助于解决此问题。按照以下步骤将其添加到 tomcat 服务器:

        • eclipse中双击服务器

        • 打开启动配置

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

        【讨论】:

          【解决方案5】:

          这样设置:

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

          【讨论】:

            【解决方案6】:

            您可以设置环境变量名为:“JAVA_OPTS”,并将其值设置为-Xms256m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m

            【讨论】:

            • 似乎可以避免这个问题,但不是一个好的解决方案。我怀疑在属性文件中频繁保存数据是错误的设计,如果不好,应该是什么
            • 实际上是 -Xms256m -Xmx1024m。 Xms 是起始大小,Xmx 是最大堆大小。
            【解决方案7】:

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

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

            -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC
            

            【讨论】:

            • @dldnh 您能否提及应添加到 setenv.sh 文件中的整行
            • 默认情况下没有启用此功能的任何原因?
            猜你喜欢
            • 2013-08-18
            • 1970-01-01
            • 1970-01-01
            • 2014-08-23
            • 2016-03-26
            • 2011-01-04
            • 1970-01-01
            • 2011-12-23
            • 2015-08-30
            相关资源
            最近更新 更多