jvm调优之利用jdk内置的jvisualvm工具对eclipse进行优化

作者: admin 分类: JVM 发布时间: 2019-05-02 17:12  阅读: 424 views

java程序猿的必备开发工具肯定少不了eclipse, 近一年的时间在mac本上使用eclipse,安装了很多插件,随着项目的不断增大和os本身应用的增多。内存愈加吃紧。eclipse卡顿着实影响心情。之前说是一直调整JVM参数什么的。只是试试,但不知其所然。本次就借着优化eclipse的目的,看看jvm调优的过程和效果。

先来了解下jvisualvm是什么东西
VisualVM 是Netbeans的profile子项目,已在JDK6.0 update 7 中自带。直接运行即可。

VisualVM,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的).从界面上看还是比较简洁的,左边是树形结构,自动显示当前本机所运行的Java程序,还可以添加远程的Java VM,其中括号里面的PID指的是进程ID。OverView界面显示VM启动参数以及该VM对应的一些属性。Monitor界面则是监控Java堆大小,Permgen大小,Classes和线程数量。jdk不同版本中界面会不太一致,如有的含cpu监控,有的则不含(jdk1.6.0_10未包含)。

1.打开jvisualvm控制台控制台输入

chenhailongdeMacBook-Pro:~ chenhailong$ jvisualvm
2019-04-16 10:12:39.914 java[2907:274778] *** WARNING: Textured window <AWTWindow_Normal: 0x7f83ef7bb790> is getting an implicitly transparent titlebar. This will break when linking against newer SDKs. Use NSWindow's -titlebarAppearsTransparent=YES instead.

会自动打开如下界面

左侧是java本地进程,右侧是查看面板,默认是没有Visual GC这个tab页的,需要安装插件。也非常简单如下

菜单栏选择工具 -> 插件 – > 可用插件 -> Visual GC 安装即可

安装好之后就可以看到选中进程的JVM的回收次数和年轻带、年老代、元空间的占用大小变化趋势了。这个是图形化界面看起来比较直观一些,其实和jstat命令的效果差不离,会看会调就可以达到效果

在来复习下jvm内存参数的含义:

-Xmx
堆内存的64分之一
堆大小的最大值。当前主流虚拟机的堆都是可扩展的。堆由新生代和老年代组成
-Xms
堆内存的4分之一
堆大小的最小值。可以设置成和-Xmx一样的值。
-Xmn
堆内存的64分之一
新生代的大小。现代虚拟机都是分代的,堆由新生代和老年代组成。新生代增大,相应的老年代就减小。推荐是 3/8.
-Xss
每个线程的堆栈大小。该值影响一台机器能够创建的线程数上线。
-XX:MaxPermSize
永久代的最大值。永久代是HotSpot特有的,HotSpot用永久代来实现方法区。
-XX:PermSize
永久代的最小值。可以设置成和-XX:MaxPermSize一样的值。
-XX:SurvivorRatio
8
Eden和Survivor的比值。基于复制的垃圾收集器又会把新生代分为一个eden和两个Survivor,如果该参数为8.就表示eden占80%,其他survivor各占10%
-XX:NewRatio
2
新生代和老年代的比例为1:2
-XX:PretenureSizeThreshold
0
直接晋升到老年代的对象大小。大于这个参数的对象将直接在老年代分配。默认为0,表示不启用。
-XX:HandlePromotionFailure
是否允许分配担保失败。在jdk6 后已经失效。
-XX:MaxTenuringThreshold
15
对象晋升到老年代的年龄。对象每经过一次MinorGC后年龄就加1,超过这个值时就进入老年代。默认值为15
-XX:MaxDirectMemorySize
0
直接内存的最大值。对于频繁使用NIO的应用,应该显式的设置该参数,默认值为0

附上官方原址:https://www.oracle.com/technetwork/java/gc-tuning-5-138395.html
JDK 1.8永久代调整为了元空间,受本地内存大小的限制。

 

2. 设置eclipse的启动参数,默认参数如下:

eclipse.ini的默认配置信息如下
-startup
../Eclipse/plugins/org.eclipse.equinox.launcher_1.4.0.v20161219-1356.jar
--launcher.library
../Eclipse/plugins/org.eclipse.equinox.launcher.cocoa.macosx.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
-XstartOnFirstThread
-Dorg.eclipse.swt.internal.carbon.smallFonts
-Dosgi.requiredJavaVersion=1.8
--add-modules=ALL-SYSTEM
-Xdock:icon=../Resources/Eclipse.icns
-XstartOnFirstThread
-Dorg.eclipse.swt.internal.carbon.smallFonts
-Xms1024m
-Xmx1024m

可以看到上图中,
1.左侧为JVM的 Metaspace\Old\Eden【元空间、老年代、年轻代[eden和2个survivor区]】。
2.右侧为Compile Time – Class Loader Time- 还有各个区的分配内存大小,实际使用内存大小。GC次数。
3.操作流程为:启动eclipse、并启动其中一个tomcat服务。
4.发现 Eden Space 共进行了43次 collections【回收】从峰值快速跌入谷底是tomcat服务启动之后发生。且期间42变为了43进行了一次回收
5.说明eclipse在启动时创建了大量的短生命周期的对象。检查启动时是否加载了很多插件jar等。这时需要确保Eden区较大,以减少minor GC的次数

Old Gen是存放生命周期较长的对象。也占用了大半多。说明eclipse整体加载了很多内容。配置的内存整体较小。
Metaspace主要存放class和meta元数据,不会执行GC。

根据以上的情况,做以下操作
1.增加分配给eclipse的整体堆内存 1g –>2g
2.年轻代的 Eden和survivor区比例为默认的 8:1:1
3.年轻代的Eden区稍比old大一些 1g,用来存放生命周期较短的对象

调整后的jvm参数如下:

-Xms1024m
-Xmx2048m
-XX:NewSize=1408m
-XX:MaxNewSize=1408m
-verbose:gc
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:/Users/chenhailong/Desktop/gc.log     
//最后三行是打印GC的日志数据

重启之后效果如下:

同样的操作流程, Eden区的GC次数少了一半多。依然有14次.这就真的是因为插件、组件开启太多的原因了。eclipse启动过程中要加载这些资源不能避免GC。当然优化效果还是有一些的。想要效果更好,只能是卸载一些组件,进行优化了,暂时不试了。

以上的eclipse调优只是一种思路。做JVM的调优需要大量的实践和分析。有需要的可以去试试


这里只看GC板块的调优及波动效果,如果需要使用其他板块的功能,
请访问:https://docs.oracle.com/javase/6/docs/technotes/tools/share/jvisualvm.html 官方的答案最官方了。
虽然是英文但是能翻译啊,虽然不懂硬着头皮上啊。

这里的jvisulvm是可视化的,和jstat -gc 命令其实差不多。对JVM参数含义熟悉的话,jstat -gc使用起来更方便、灵巧


   原创文章,转载请标明本文链接: jvm调优之利用jdk内置的jvisualvm工具对eclipse进行优化

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

更多阅读