如何处理tomcat PermGen空间
背景 :我有一个使用JSP的Web项目。 IDE是Eclipse。 tomcat的配置是:资源发生变化时自动发布,发布间隔为“1秒”。
classes文件夹中的属性文件,用于保存一些设置。它也可以由servlet动态修改。 修改操作由JSP中的save按钮进行分区。
问题 :在几次保存操作之后,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。 512米不是一个不合理的最大值。 然而,它只会延迟热部署泄漏。 Permgen每个hotdeploy将增长大约25mb,在Eclipse中,每次保存Java文件时都可能。 如果你有像我这样的Ctrl + S抽搐,512米会快速消失。
解决方案:允许Java将类定义从内存中取出,即垃圾收集字节代码。 添加这些以及增强的permgen大小:
-XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC
您可以设置名为“ JAVA_OPTS
”的环境变量,并设置它的值如下-Xms256m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m
为了ECLIPSE
- 转到服务器属性
- 转到平台
- 现在在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“
就这样
设置如下:
-Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m
只是为Windows添加,如果有人仍然卡住: –
- 打开catalina.bat文件(位于Apache tomcat安装文件夹/ bin)
-
一开始就设置JAVA_OPTS如下(实际上它首次在文件中的任何地方使用之前): –
设置JAVA_OPTS = -Dfile.encoding = UTF-8 -Xms128m -Xmx1024m -XX:PermSize = 64m -XX:MaxPermSize = 256m
-
重启Tomcat及其完成。
你可以在这里找到很好的解释
Tomcat服务器运行不同的JAVA,eclipse运行在不同的JAVA中。
因此,向eclipse.ini
添加-XX:MaxPermSize=512m
将有助于解决此问题。 按照以下步骤将其添加到tomcat服务器:
-
在eclipse中双击服务器
-
打开启动配置
-
将“-XX:MaxPermSize = 512m”添加到Arguments选项卡中的VM参数。
只需从apache tomcat接口配置它:
- 启动C:\ Program Files \ Apache Software Foundation \ Tomcat 8.5 \ bin \ Tomcat8w.exe(或者你可以在windows启动中搜索“配置Tomcat”);
- 转到Java选项卡;
- 在输入字段中设置所需的空间: