背景:我有一个使用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)
答案 0 :(得分:34)
Tomcat确实需要大量的permgen。 512米不是一个不合理的最大值。然而,它只会延迟热部署泄漏。 Permgen每个hotdeploy将增长约25mb,在Eclipse中,每次保存Java文件时都可能。如果你有像我这样的Ctrl + S抽搐,512米会快速消失。
解决方案:允许Java将类定义从内存中取出,即垃圾收集字节代码。添加这些以及增加的permgen大小:
-XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC
答案 1 :(得分:13)
您可以设置名为“JAVA_OPTS
”的环境变量,并按以下方式设置它的值-Xms256m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m
答案 2 :(得分:6)
FOR ECLIPSE
FOR NETBEANS
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“
多数人
答案 3 :(得分:5)
设置如下:
-Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m
答案 4 :(得分:1)
只是为Windows添加,如果有人仍然卡住: -
在一开始就设置JAVA_OPTS(实际上它首次在文件中的任何地方使用之前): -
设置JAVA_OPTS = -Dfile.encoding = UTF-8 -Xms128m -Xmx1024m -XX:PermSize = 64m -XX:MaxPermSize = 256m
重启Tomcat及其完成。
你可以找到很好的解释here
答案 5 :(得分:1)
只需从apache tomcat界面进行配置:
答案 6 :(得分:0)
Tomcat服务器运行不同的JAVA,eclipse运行在不同的JAVA中。
因此,将$("#yeartext").html(data.years_array);
添加到-XX:MaxPermSize=512m
将有助于解决此问题。按照以下步骤将其添加到tomcat服务器:
在eclipse中双击服务器
打开启动配置
在Arguments选项卡中为VM参数添加“-XX:MaxPermSize = 512m”。