简体   繁体   English

如何处理 tomcat PermGen 空间

[英]what to do with tomcat PermGen space

BACKGROUND : I have a web Project which uses JSP. The IDE is Eclipse. The configuration of tomcat is: Automatically publish when resources change and publishing interval is "1 second".背景:我有一个 web 项目,它使用 JSP。IDE 是 Eclipse。tomcat 的配置是:资源更改时自动发布,发布间隔为“1 秒”。

A property file in the classes folder which used to save some settings.It also can be dynamically modified by the servlet. classes文件夹中的一个属性文件,用于保存一些设置。它也可以被servlet动态修改。 The modify operation is trigerred by the save button in the JSP.修改操作由 JSP 中的保存按钮触发。

PROBLEM : After several save operation, Tomcat come with java.lang.OutOfMemoryError: PermGen space .问题:经过几次保存操作后,Tomcat 出现java.lang.OutOfMemoryError: PermGen space

LOG MESSAGE日志消息

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 does need a lot of permgen. Tomcat 确实需要很多 permgen。 512m is not an unreasonable max. 512m 不是不合理的最大值。 However it only delays the hot-deploy leak.然而,它只会延迟热部署泄漏。 Permgen will grow ~25mb per hotdeploy, which, in Eclipse, might be every time you save a Java file.每个 hotdeploy Permgen 将增长约 25mb,在 Eclipse 中,可能是每次保存 Java 文件时。 512m disappears fast if you have a Ctrl+S twitch like me.如果您像我一样使用 Ctrl+S 抽动,512m 会很快消失。

The solution: allow Java to kick class definitions out of memory, ie, garbage collect byte code.解决方案:允许 Java 从 memory 中踢出 class 定义,即垃圾收集字节码。 Add these along with your boosted permgen size:将这些与您提升的 permgen 大小一起添加:

-XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC

You may set environment variable named: " JAVA_OPTS " and set value of it as follows -Xms256m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m您可以设置名为“ JAVA_OPTS ”的环境变量,并将其值设置为-Xms256m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m

FOR ECLIPSE对于 ECLIPSE

  1. Go to server properties Go 到服务器属性
  2. Go to platform Go转平台
  3. Now in VM argument write this -Xms256m -Xmx256m -XX:PermSize=256m -XX:MaxPermSize=512m现在在 VM 参数中写这个 -Xms256m -Xmx256m -XX:PermSize=256m -XX:MaxPermSize=512m

FOR.NETBEANS对于.NETBEANS

  1. Go to Netbeans folder/etc/ Go 到 Netbeans 文件夹/etc/
  2. open.netbeans.config in any editor在任何编辑器中打开 netbeans.config
  3. edit this line as将此行编辑为

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" 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=真-J-Dsun.java2d.noddraw=真-J-Dsun.java2d.dpiaware=真-J-Dsun.zip.disableMemoryMapping=真”

Thats all就这样

setting like this:像这样设置:

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

在此处输入图像描述

Just configure it from the apache tomcat interface:只需从 apache tomcat 接口配置即可:

  1. start C:\Program Files\Apache Software Foundation\Tomcat 8.5\bin\Tomcat8w.exe (or you may just search in windows start for "Configure Tomcat");开始 C:\Program Files\Apache Software Foundation\Tomcat 8.5\bin\Tomcat8w.exe(或者您可以在 windows 开始搜索“配置 Tomcat”);
  2. Go to Java tab; Go 至 Java 标签;
  3. Set the required space in the input fields:在输入字段中设置所需的空间: 在此处输入图像描述

Just to add for Windows, if someone is still stuck:--只是为了添加 Windows,如果有人仍然卡住:--

  1. Open catalina.bat file (located at Apache tomcat installation folder/bin)打开catalina.bat文件(位于Apache tomcat安装文件夹/bin)
  2. Set JAVA_OPTS as follows in the very start(before actually its first use anywhere in the file):--在一开始就按如下方式设置 JAVA_OPTS(在实际首次使用文件中的任何位置之前):--

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

  3. Restart Tomcat and its done.重新启动 Tomcat 并完成。

You can find nice explanation here你可以在这里找到很好的解释

Tomcat server runs different JAVA and the eclipse runs in different JAVA. Tomcat 服务器运行不同的 JAVA 和 eclipse 运行不同的 JAVA。

So adding -XX:MaxPermSize=512m to eclipse.ini will help resolving this issue.因此,将-XX:MaxPermSize=512m添加到eclipse.ini将有助于解决此问题。 Follow the below steps to add this to tomcat server:按照以下步骤将其添加到 tomcat 服务器:

  • Double click server in eclipse双击eclipse中的服务器

  • open launch configuration打开启动配置

  • add "-XX:MaxPermSize=512m" to VM arguments in the Arguments tab.在 Arguments 选项卡中将“-XX:MaxPermSize=512m”添加到 VM arguments。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM