本系列是用来记录《深刻理解Java虚拟机》这本书的读书笔记。方便本身查看,也方便你们查阅。app
欲速则不达,欲达则欲速!eclipse
这两天看了JVM的内存优化,决定尝试一下,对Eclipse进行内存调优。
本次使用的机器为64位Win10系统,虚拟机为Java HotSpot(TM) 64-Bit。硬件是台式联想电脑,Intel Pentium G630,8G物理内存。
1、Eclipse配置文件eclipse.ini工具
-startup plugins/org.eclipse.equinox.launcher_1.4.0.v20161219-1356.jar --launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.551.v20171108-1834 -product org.eclipse.epp.package.jee.product -showsplash org.eclipse.epp.package.common --launcher.defaultAction openFile --launcher.defaultAction openFile --launcher.appendVmargs -vmargs -Dosgi.requiredJavaVersion=1.8 -Dosgi.instance.area.default=@user.home/eclipse-workspace -XX:+UseG1GC -XX:+UseStringDeduplication --add-modules=ALL-SYSTEM -Dosgi.requiredJavaVersion=1.8 -Xms256m -Xmx1024m --add-modules=ALL-SYSTEM -Dcom.sun.management.jmxremote
初始设置指定了1.8版本的JDK,采用G1收集器,设置最大堆为1024M以及开启了JMX管理。性能
2、调优前的运行情况测试
写了个eclipse启动计时插件(将Jar包放到Eclipse的plugins目录下,启动Eclipse,能够显示Eclipse的启动时间),记录优化前的启动时间,为了保证测试结果的准确性,应该屡次启动最后一次结果:优化
根据Visual GC和插件获得以上的信息截图,咱们能够总结出原始配置下的启动情况:
1.整个启动耗时35秒。
2.垃圾收集总耗时1.126秒,其中Full GC 0 次,Minor GC 25 次,耗时1.126秒。
3.加载类19991个,共耗时38.131秒。
4.JIT编译时间为46.103秒(随着时间流逝,编译次数和时间不停增加)。
5.虚拟机1024MB的堆内存被分配为,新生代当前分配63M,老年代187M。
总的来讲启动时间不算短,因此仍是有能够调优的空间。ui
3、堆内存与Metaspace优化spa
打开VisualVM,直接查看内存曲线变化.net
从上图看,不论是Java堆的曲线变化仍是Mwtaspace曲线变化,运做都彻底正常。
暂时找不到可优化的条件。插件
4、编译时间和类加载时间的优化
看上图调优前的运行情况,编译时间和类加载时间应该是优化的重头戏了。
先看类加载时间。因为类加载须要进行字节码验证耗时,考虑到eclipse使用者众多,它的编译代码咱们认为是可靠的,不须要加载的时候再进行字节码验证,所以经过参数-Xverify:none禁止掉字节码验证过程也能够认为是优化手段。
在取消掉字节码验证以后,确实能够看到Ecipse启动速度有了必定的提高,但仍还不够。
在类加载个数上,能够看出初始情况加载了19991个类,能够在eclipse中关掉不须要的启动项。
可是编译时间上目前没找到太好的办法~~~不知道怎么解决,但愿有高人指点
5、调整内存,减小垃圾收集次数
上面说到了编译时间 类加载时间,那么剩下的就是GC时间了。
能够看出,这次Full GC被触发了 4 次,Minor GC 8 次。
这次GC次数并不算多,可是从监视器中能够看出,堆内存的使用不该该发生Full GC才对。
为了可以更好的看到eclipse启动期间所作的GC收集操做,咱们加入配置-Xloggc:gc.log。
能够看出每次的Full GC 都是有Metadata GC Threshold形成的,也就是元空间引起的full GC。
从JDK8开始,永久代(PermGen)的概念被废弃掉了,取而代之的是一个称为Metaspace的存储空间。Metaspace使用的是本地内存,而不是堆内存,也就是说在默认状况下Metaspace的大小只与本地内存大小有关。每次Full GC,Metaspace都在调整阈值。所以,再加入-XX:MetaspaceSize=256M
可是仍能够看到每次发生的Minor GC都是有新生代内存不够所致使,所以,仍需提高配置
**-Xms2048m
-Xmx2048m
-Xmn512m**
本次调优完毕,只有3次Minor GC 耗时600毫秒。
可是启动时间仍须要27秒。。。。。。。。。灰常尴尬。
目测时间仍是花费在了类加载与编译上。须要更加进一步的优化。最后,贴出本次调优后的最终eclipse.ini配置
-startup plugins/org.eclipse.equinox.launcher_1.4.0.v20161219-1356.jar --launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.551.v20171108-1834 -product org.eclipse.epp.package.jee.product -showsplash org.eclipse.epp.package.common --launcher.defaultAction openFile --launcher.defaultAction openFile --launcher.appendVmargs -vmargs -Dosgi.requiredJavaVersion=1.8 -Dosgi.instance.area.default=@user.home/eclipse-workspace --add-modules=ALL-SYSTEM -Dosgi.requiredJavaVersion=1.8 --add-modules=ALL-SYSTEM -Xms2048m -Xmx2048m -Xmn512m -Dcom.sun.management.jmxremote -Xverify:none -Xloggc:gc.log -XX:MetaspaceSize=256M
相关博文:
素小暖讲JVM:第一章 走进Java,第二章 Java内存区域与内存溢出异常,第三章 垃圾收集器与内存分配策略
素小暖讲JVM:第四章 虚拟机性能监控与故障处理工具总结,第五章 调优案例分析与实战
素小暖讲JVM:第六章 类文件结构,第七章 类加载机制,第八章 字节码执行引擎
鸣谢:特别感谢做者周志明提供的技术支持!