用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空间做啥的主要内容,如果未能解决你的问题,请参考以下文章
我出现内存不足错误,如何解决?Permgen 空间区域是啥意思?是啥原因造成的? [复制]
如何在 Tomcat 中部署之前监控 PermGen 空间使用情况