本篇文章为大家展示了怎么在IntelliJ Idea中对JVM的性能进行调试,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
调优前的运行状态
,原始配置内容
要查询想法原始配置文件的路径可以在VisualVM中的概述中查看
原始配置内容:
- xx: ReservedCodeCacheSize=240 - xx: + UseCompressedOops -Dfile.encoding=utf - 8 - xx: SoftRefLRUPolicyMSPerMB=50 ea -Dsun.io.useCanonCaches=false -Djava.net.preferIPv4Stack=true -Djdk.http.auth.tunneling.disabledSchemes=?“ - xx: + HeapDumpOnOutOfMemoryError - xx: -OmitStackTraceInFastThrow - xx: ErrorFile=$ USER_HOME/java_error_in_idea_ % p.log - xx: HeapDumpPath=$ USER_HOME/java_error_in_idea.hprof -Xmx512m
打印启动时间插件开发
需要直观的看到优化前和优化后启动时间的变化,所以需要简单做一个想法的插件开发,关于想法插件开发的流程建议参考我以前的文章《想法插件:多线程文件下载插件开发》
JVM的启动时间到所有组件初始化完成后的时间就看做是想法的启动时间,代码如下
public class MyApplicationInitializedListener implements ApplicationInitializedListener { @Override才能 public 才能;void  componentsInitialized (), { ,,,RuntimeMXBean bean =, ManagementFactory.getRuntimeMXBean (); ,,,long startTime =, bean.getStartTime (); ,,,long costTime =, System.currentTimeMillis(),背后,开始时间; ,,,Messages.showMessageDialog(“毫秒:“,+,costTime,,“启动耗时“,,Messages.getInformationIcon ()); ,,} }
插件。xml中添加如下代码:
& lt; extensions defaultExtensionNs=癱om.intellij"比; & lt;才能applicationInitializedListener id=癕yApplicationInitializedListener" ,,,,,,,,,,,,,,,,,实现=癱n.silently9527.MyApplicationInitializedListener"/比; & lt;/extensions>
优化前的启动信息与时间消耗
根据VisualGC和想法启动插件收集到的信息:
- <李>
想法启动耗时15秒总共垃圾收集22次,耗1.2时,其中新生代GC 17次,耗时324 ms;
李> <李>老年代GC 5次,耗时953 ms加载类27526个,耗21岁时
李>按照这个数据来看也算是正常,15秒其实也在接受范围内,由于本文主要演示性能调优,所以需要测试能否在快一些
开始尝试优化
调整内存来控制垃圾回收频率
图上我们可以看的出,启动参数指定的512米的内存被分配到新生代的只有169米,由于想法是我们开发常用的工具,平时的编译过程也需要足够的内存,所以我们需要先把总的内存扩大,这里我设置最大的内存<代码> -Xmx1024m> 代码,为了让JVM在GC期间不需要再浪费时间再动态计算扩容大小,同时也设置了<代码> -Xms1024m> 代码;
在启动的过程中伊甸园共发生了17次GC,为了减少新生代GC次数,我把新生代的内存大小设置成<代码> -Xmn256m> 代码;
重新启动之后查看VisualGC,新生代GC次数从17次降低到了7次,耗时从324 ms降低到了152 ms。
在调整内存前发生了5次完整GC调整内存后的依然还是有4次GC,但是从两张图我们可以看的出,老年代的空间还有很多剩余,是不应该发生完整GC的;考虑是否是代码中有地方手动调用<代码> system . GC() 代码>出发了完整的GC,所以添加了参数<代码> - xx: + DisableExplicitGC> 代码,再次重新启动的想法,结果很失望,依然还满有4次GC;
再次仔细观察优化前的图,注意看最后的原因:元数据GC阈值,最后一次GC是应该Metaspace区域内存不够发生的GC,为了验证我们的猜想,打印出GC日志来看看。在<代码>的想法。vmoptions> 代码中添加打印日志相关的参数:
- xx: + PrintGCDetails - xx: + PrintGCDateStamps -Xloggc: . ./gc。日志怎么在IntelliJ Idea中对JVM的性能进行调试