Idea下启动tomcat关于内存分配问题

1. 问题初现

     以前都是用的Eclipse开发,准备转战Idea。将项目导入idea中,tomcat启动后报错

15:57:20.969 [RMI TCP Connection(3)-127.0.0.1] ERROR o.s.web.context.ContextLoader - Context initialization failed
nested exception is java.lang.OutOfMemoryError: GC overhead limit exceeded

2.问题原因

     同一个项目在Eclipse中正常跑,在Idea中报错。首先项目本身没问题,毕竟每天跑无数次。觉得是Idea的配置出错,可能是JVM的内存分配问题。

3. 解决问题

   3.1 打开Idea的安装目录下>bin>idea64.exe.vmoptions 文件。(我的是64位,32位的电脑打开idea.exe.vmoptions)

   修改JVM参数

-Xms1024m
-Xmx1024m
-XX:PermSize=512m
-XX:MaxPermSize=1024m

  3.2 重启Idea,启动tomcat,发现问题还在,并没有解决。

  3.3 在Idea的tomcat配置里,VM options 添加  -XX:+PrintGCDetails 打印GC详细信息

Idea下启动tomcat关于内存分配问题_第1张图片

3.4 重启Tomcat,查看GC信息发现, ParOldGen 老年代内存只有40M大小,导致项目运行是频繁的Full GC,造成Gc overhead       limit exceeded

[Full GC [PSYoungGen: 7168K->7153K(13824K)] [ParOldGen: 40641K->40641K(40960K)] 47809K->47795K(54784K) [PSPermGen: 35410K->35410K(1048576K)], 0.2227154 secs] [Times: user=0.19 sys=0.00, real=0.22 secs] 
[Full GC [PSYoungGen: 7168K->3487K(13824K)] [ParOldGen: 40641K->40641K(40960K)] 47809K->44129K(54784K) [PSPermGen: 35411K->35411K(1048576K)], 0.1948111 secs] [Times: user=0.17 sys=0.00, real=0.19 secs] 

     到这里,百思不得其解。明明配置了JVM参数,设置了 XMX和XMS大小为1024M,为何老年代只有40M?为了详细的查看GC的情况,在Idea中安装了VisualVM插件,并且这个插件中安装VisualGC插件。

Idea-->File settings-->Plugins-->Browse repositories>搜索VisualVM,点击安装

安装好后是中文版的。在VisualVM中,工具-->插件-->可用插件-->更新后搜索VisualGC。

此时发现无法更新。。。

Idea下启动tomcat关于内存分配问题_第2张图片

只能手动安装插件咯。点击进去,VisualVm插件地址,选择自己的版本。我的是 JDK 7 Update 40 - 55 。然后下载

Idea下启动tomcat关于内存分配问题_第3张图片

下载后,在VisualVm中-->工具-->插件-->已下载-->添加插件,安装下载的Visual GC插件。

3.5 重启Idea 点击Run with VisualVm.

 

VisualVm工具会自动打开。在概述中,可以查看启动的Tomcat的JVM参数

-Dvisualvm.id=4838640967633
-Dvisualvm.id=4829402469447
-Xms1024m
-Xmx1024m
-XX:PermSize=1024m
-XX:MaxPermSize=1024
-XX:+PrintGCDetails
-Dcom.sun.management.jmxremote=
-Dcom.sun.management.jmxremote.port=1099
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=127.0.0.1
-Djava.util.logging.config.file=C:\Users\Administrator\.IntelliJIdea2017.3\system\tomcat\Unnamed_demo\conf\logging.properties
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Xmx60m
-Xms30m
-Djava.endorsed.dirs=F:\develop\apache-tomcat-7.0.53\endorsed
-Dcatalina.base=C:\Users\Administrator\.IntelliJIdea2017.3\system\tomcat\Unnamed_demo
-Dcatalina.home=F:\develop\apache-tomcat-7.0.53
-Djava.io.tmpdir=F:\develop\apache-tomcat-7.0.53\temp

可以发现,之前配置的JVM启动参数起作用了。但是,下面还有俩行配置,覆盖了之前的参数配置,导致JVM堆内存最大只有60M。

-Xmx60m
-Xms30m

这个60M从哪里来,这个暂时无法知道。但是仔细看发现,后面还有几条JVM配置信息。

-Djava.endorsed.dirs=F:\develop\apache-tomcat-7.0.53\endorsed
-Dcatalina.base=C:\Users\Administrator\.IntelliJIdea2017.3\system\tomcat\Unnamed_demo
-Dcatalina.home=F:\develop\apache-tomcat-7.0.53
-Djava.io.tmpdir=F:\develop\apache-tomcat-7.0.53\temp

百度发现这些配置是在系统的环境变量中取得的。于是在计算机-->属性-->高级系统设置-->环境变量中查看。果然发现了- Xmx60M -Xms30M的配置

Idea下启动tomcat关于内存分配问题_第4张图片

辛辛苦苦找到了问题的源头,那还不趁热解决。修改配置信息为 -Xmx1024M -Xms512M

3.6 重启Idea,点击Run with VisualVm。查看JVM参数

-Dvisualvm.id=6417598049205
-Dvisualvm.id=6406476402946
-Xms1024m
-Xmx1024m
-XX:PermSize=1024m
-XX:MaxPermSize=1024
-XX:+PrintGCDetails
-Dcom.sun.management.jmxremote=
-Dcom.sun.management.jmxremote.port=1099
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=127.0.0.1
-Djava.util.logging.config.file=C:\Users\Administrator\.IntelliJIdea2017.3\system\tomcat\Unnamed_language\conf\logging.properties
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Xmx1024m
-Xms512m
-Djava.endorsed.dirs=F:\develop\apache-tomcat-7.0.53\endorsed
-Dcatalina.base=C:\Users\Administrator\.IntelliJIdea2017.3\system\tomcat\Unnamed_language
-Dcatalina.home=F:\develop\apache-tomcat-7.0.53
-Djava.io.tmpdir=F:\develop\apache-tomcat-7.0.53\temp

发现成功修改!然后在VisualGC中查看GC内存回收情况。发现一切正常!

最后,项目成功启动,问题解决!

4. 问题总结

   4.1 Idea在启动Tomcat的时候,最后会加载系统环境变量中的信息。如果在CATALINA_OPTS中配置了JVM的参数,会覆盖Idea中的JVM参数配置!

   4.2 通过VisualGC可以看出JVM运行时GC情况,便于我们合理设置JVM参数,进行JVM调优!


你可能感兴趣的:(JAVA,JVM)