如何处理tomcat PermGen空间

2022-09-01 15:10:42

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

类文件夹中用于保存某些设置的属性文件。它也可以被 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)

答案 1

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

解决方案:允许Java将类定义踢出内存,即垃圾回收字节码。将这些与增加的烫发量一起添加:

-XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC

答案 2

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


推荐