用tomcat PermGen空间做啥

Posted

技术标签:

【中文标题】用tomcat PermGen空间做啥【英文标题】: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 可能重复。 ***.com/questions/88235/… 每当人们在不重新启动 Tomcat 的情况下重复重新部署 Web 应用程序时,我都会在 Tomcat 中收到此错误。由于与类加载过程相关的泄漏,permgen 空间在每次重新部署时都会变得更满。增加 permgen 大小会延迟它耗尽内存的时间,但实际上,您需要确保 Tomcat 在重新部署 web 应用程序时被反弹。 PermGen space Error in tomcat的可能重复 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

    打开 catalina.bat 文件(位于 Apache tomcat 安装文件夹/bin)

    一开始就设置JAVA_OPTS如下(实际上是在文件中的任何地方第一次使用它之前):--

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

    重启 Tomcat 并完成。

你可以找到很好的解释here

【讨论】:

【参考方案3】:

日食

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

对于 NETBEANS

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

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 文件中的整行 默认情况下没有启用此功能的任何原因?

以上是关于用tomcat PermGen空间做啥的主要内容,如果未能解决你的问题,请参考以下文章

tomcat出现的PermGen Space问题

我出现内存不足错误,如何解决?Permgen 空间区域是啥意思?是啥原因造成的? [复制]

如何在 Tomcat 中部署之前监控 PermGen 空间使用情况

如何清除tomcat中的PermGen空间错误

Tomcat PermGen 上的 Spring MVC 空间不断增加

增加基于 Windows 安装程序的 Tomcat PermGen 空间