问题
linux的jetty下发布程序后再启动jetty服务时,发现启动不了,从日志中找到报java.lang.OutOfMemoryError: PermGen space。
原因分析
PermGen space,全称是Permanent Generation space,指的是内存3带中的永久区域。当java中间件启动时,会将相关的jar包和.class加载到永久区域,而用就区域的空间是固定的,虽然可以设置。报这个错的原因就是在启动加载.class时,永久区域溢出了。我这次碰到的原因可能很复杂,由于本人能力有限,大概说一说,如果理解错的,还请大牛们指点!这次本人怀疑可能是老版本在永久区域留下的东西没有被清掉,然后新版本上的时候永久区空间不够了,因为在jetty的start.ini配置中有一项配置是让CMS可以清除永久区的东西的那一项我们的jetty上是没有设置的。当然这也是本人的猜测,本人能力有限,也无法考证。
解决方案:
1、在jetty的jetty.XML配置文件的<Configure id="Server" class="org.eclipse.jetty.server.Server">节点下加入如下内容:
<Call name="setAttribute">
<Arg>org.eclipse.jetty.server.Request.maxFormContentSize</Arg>
<Arg>-1</Arg>
</Call>
<Call name="setAttribute">
<Arg>org.eclipse.jetty.server.Request.maxFormKeys</Arg>
<Arg>-1</Arg>
</Call>
2、修改start.ini文件中的如下部分:
-Xmn512m
-XX:PermSize=512m
-XX:MaxPermSize=1024m
-Dsun.rmi.dgc.server.gcInterval=3600000是设置客户端和服务端GC启动的时间。
-Xmx2000m最大缓存空间、
-Xmn512m新生代大小、
- -XX:PermSize=512m内存永久区初始大小、
- -XX:MaxPermSize=1024m最大永久区大小,
- -XX:MaxPermSize=1024m允许CMS清楚老年代,
- -XX:+CMSClassUnloadingEnabled,
- -XX:+CMSClassUnloadingEnabled 允许CMS清楚持久代。
-
linux的jetty下发布程序后再启动jetty服务时,发现启动不了,从日志中找到报java.lang.OutOfMemoryError: PermGen space。
原因分析
PermGen space,全称是Permanent Generation space,指的是内存3带中的永久区域。当java中间件启动时,会将相关的jar包和.class加载到永久区域,而用就区域的空间是固定的,虽然可以设置。报这个错的原因就是在启动加载.class时,永久区域溢出了。我这次碰到的原因可能很复杂,由于本人能力有限,大概说一说,如果理解错的,还请大牛们指点!这次本人怀疑可能是老版本在永久区域留下的东西没有被清掉,然后新版本上的时候永久区空间不够了,因为在jetty的start.ini配置中有一项配置是让CMS可以清除永久区的东西的那一项我们的jetty上是没有设置的。当然这也是本人的猜测,本人能力有限,也无法考证。
解决方案:
1、在jetty的jetty.XML配置文件的<Configure id="Server" class="org.eclipse.jetty.server.Server">节点下加入如下内容:
<Call name="setAttribute">
<Arg>org.eclipse.jetty.server.Request.maxFormContentSize</Arg>
<Arg>-1</Arg>
</Call>
<Call name="setAttribute">
<Arg>org.eclipse.jetty.server.Request.maxFormKeys</Arg>
<Arg>-1</Arg>
</Call>
2、修改start.ini文件中的如下部分:
--exec
-Dsun.rmi.dgc.client.gcInterval=3600000
-Dsun.rmi.dgc.server.gcInterval=3600000
-Dcom.sun.management.jmxremote
-Dorg.eclipse.jetty.util.log.IGNORED=true
-Dorg.eclipse.jetty.util.log.stderr.DEBUG=true
-Dorg.eclipse.jetty.util.log.stderr.SOURCE=true
-Xmx2000m-Xmn512m
-XX:PermSize=512m
-XX:MaxPermSize=1024m
-verbose:gc
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-XX:+PrintTenuringDistribution
-XX:+PrintCommandLineFlags
-XX:+DisableExplicitGC
-XX:+UseConcMarkSweepGC-XX:ParallelCMSThreads=2
-XX:+CMSClassUnloadingEnabled-XX:+UseCMSCompactAtFullCollection
-XX:CMSInitiatingOccupancyFraction=80
-----------------------------------------------------------
新增的 -Dsun.rmi.dgc.client.gcInterval=3600000,-Dsun.rmi.dgc.server.gcInterval=3600000是设置客户端和服务端GC启动的时间。
-Xmx2000m最大缓存空间、
-Xmn512m新生代大小、
- -XX:PermSize=512m内存永久区初始大小、
- -XX:MaxPermSize=1024m最大永久区大小,
- -XX:MaxPermSize=1024m允许CMS清楚老年代,
- -XX:+CMSClassUnloadingEnabled,
- -XX:+CMSClassUnloadingEnabled 允许CMS清楚持久代。
-
- 设置了这些后,问题成功解决。
---------------------------------------
自己的解决办法:
在start.init 文件最后加了几句话:
-Xmx=2000m
-Xmn=512m
-XX:PermSize=512m
-XX:MaxPermSize=1024m