如何处理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

  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“

就这样

设置如下:

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

在此处输入图像描述

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

你可以在这里找到很好的解释

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

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

  • 在eclipse中双击服务器

  • 打开启动配置

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

只需从apache tomcat接口配置它:

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