Idea调优(有感周老师Eclipse调优)

1,659 阅读5分钟

简介

笔者有幸拜读周志明老师《深入理解Java虚拟机》神书,被老师丰富的调优经历深深折服,自己也想尝试一番;书中介绍的是Eclipse调优,笔者用的是Idea,本着照葫芦画瓢的心情,和大家分享一下我的idea调优过程

准备调优环境

本次监控虚拟机运行用到的命令

jps -l  #返回java虚拟机运行的pid,以及运行的全限定类名
jstat -gccause pid   #返回gc原因以及一些统计信息
jstat -class pid  #返回类加载卸载的一些信息
jvusualvm  #监控JVM状况的GUI工具,包括堆,非堆,线程,CPU的占用信息

为了可视化展示GC,推荐大家安装Visual GC这款工具;安装地址:https://visualvm.github.io/pluginscenters.html 若无法访问,请看我上一篇博客如何解决。 安装之后的效果图

image.png

监控idea JVM参数变化及打印GC信息

1、先开启jvusalvm,再开启idea,等到idea图标出现点进去

image.png

进入到VisualGC页面开始记录GC信息

2、记录GC打印信息需要参数

-verbose:gc  #开启记录gc信息功能
-Xloggc:gcc.log  #将gc信息打印到桌面上的gcc.log,当然也可以写其他路径,这里默认相对路径是桌面

将参数写到idea配置文件中,注意写在C盘的配置文件中,而不是idea安装位置的配置文件。

以上两步准备完成后,启动idea。

idea启动各部分动作耗时

1、idea启动完成后,利用jps查看idea启动pid:

image.png

2、查看其类加载卸载信息

image.png

image.png

可见使用VisualGC和命令行得出的结果一致,花了38.953s时间用于类的加载卸载

3、查看运行期编译状况

image.png fuck_the_regulations方法类型吸引住了我的目光~

image.png 编译耗时:41.676s

4、查看GC信息

image.png

image.png

image.png

可以看到发生了80次MinorGC,耗时600ms,没有发生FullGC;GC发生次数过多,是不是新生代不够大导致的?于是查看GC信息(这里截取了具有代表性的十几次GC信息)

image.png

image.png

image.png

image.png

image.png 可以看到堆从原本的123M扩容到了382M,堆的扩容肯定占用了一些时间

尝试优化的角度

1、即时编译时间过长(41.676s)

针对第一点,其实idea已经做了优化,有小伙伴应该也发现我们开启idea也没40多秒啊,对,因为我们开启idea后某些类还在编译;也就是idea可以一边工作,一边编译;这是使用CMS垃圾收集器的缘故,由于在开启idea时,我们的CPU占用率并不高,所以可以考虑消耗处理器资源,实现一边编译一边工作,CMS比较符合这类场景;此处使用SerialOld会有明显编译停顿;当然可以使用-Xint来禁止即时编译器运作。 然后发现idea开启更慢了,获取不到编译时间了,但类的加载卸载花了57.12s!

image.png

image.png

image.png

对于即时编译时间过长问题,我们保留idea原本配置

2、类加载卸载时间过长(38.953s)

针对第二点,由于类的加载包括:加载(将Class类加载进内存),验证(验证加载进内存的Class是否符合虚拟机格式),准备(开辟内存空间,赋默认初始值0,null,false等),解析(将符号引用转换为直接引用),初始化(给静态变量初始化)几个阶段。我们可以通过参数-Xverify:none关闭类的验证阶段,因为我们可以认为idea要加载的类是安全的。

image.png

配置之后的类加载卸载耗时31.72s相比之前的38.95s减少了7s!感觉idea开启更快了!当然笔者还发现,idea频繁开启其即时编译时间也变短了!

image.png

相比之前的41.45s,现在只花了30.58s;因为HotSpot即时编译器会将经常运行的代码判定为热点代码,热点代码经过即时编译器编译为本地代码,提高运行速度,这也是HotSpot名字的由来。难怪我的idea越来越快了!

3、MinorGC发生次数过多,发生时伴随着堆的扩容

通过之前的分析,我们可以扩大新生代堆内存大小,参数如下:

-Xms512M
-Xmx512M  #由于最后堆扩容到364M,我们保守点给它分配512M
-Xmn256M

结论

配置完以上这些后,我的idea快得我头皮发麻。 给大家看一下最终测试结果

image.png

类的加载耗时大大减小(类的加载不直接影响idea的开启速度,显示28s,但是我的idea开启从之前的40多s,变成了现在的10s内启动),发生MinorGC次数减少,且没有堆扩容耗时,即时编译相对于之前也减少了。

可以继续优化的角度:

1、升级jdk版本

2、使用G1收集器或者其他低延迟垃圾收集器,笔者试了G1性能确实比CMS好一些

3、编译时间和类加载时间的进一步优化

4、由于GC次数已经很少了,可优化的空间比较小

最后贴一下我的idea配置(有些参数可能不适合大家的机器,这里主要是介绍调优方法)

-Xms768M
-Xmx768M
-Xmn384M
-XX:ReservedCodeCacheSize=240m
-XX:+UseG1GC
-XX:SoftRefLRUPolicyMSPerMB=50
-Xverify:none
-ea
-XX:CICompilerCount=2
-Dsun.io.useCanonPrefixCache=false
-Djava.net.preferIPv4Stack=true
-Djdk.http.auth.tunneling.disabledSchemes=""
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-Djdk.attach.allowAttachSelf
-javaagent:C:\Users\Public\.jetbrains\jetbrains-agent-v3.2.0.de72.619