优化JVM参数提升eclipse运行速度

原文地址:http://www.javaeye.com/topic/756538java

性能优化从身边作起。

首先创建评估体系,将workspace里全部的项目close掉,关闭eclipse。优化的用例就是启动eclipse,open一个项目,eclipse会自动build这个项目,保证没有感受到明显的卡,也就是没有full GC。

开始:

eclipse.ini里加入打印gc状况的参数:

性能优化

-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-verbose:gc
-Xloggc:gc.log



这样eclipse在运行过程当中会记录gc日志,显示详细的gc状况,并打印在gc.log中,经过分析这个日志寻找eclipse的性能瓶颈和优化方式。
我最初的参数只是在原版基础上调了堆大小eclipse

-Xms512m
-Xmx512m



将堆初始化和最大值设为同样,消除堆大小根据当前堆使用状况而变化带来的影响。
启动eclipse,发现gc.log里打出了不少full gc的日志jvm

引用
4.226: [Full GC 4.226: [Tenured: 18470K->19304K(30544K), 0.1159544 secs] 25154K->19304K(44368K), [Perm : 24574K->24554K(24576K)], 0.1160431 secs] [Times: user=0.13 sys=0.00, real=0.13 secs]


在启动的6秒多时间里共出现了8次full gc,因此启动慢,以为启动时候挺卡的。从日志里能够看出来 FullGC主要是在回收tenured区和Perm区,其中Perm一直都是快满的状态,Perm : 24574K->24554K(24576K),Perm大小在不断调整,因此须要固定Perm区的大小,保证够用,eclipse.ini里加入性能

-XX:PermSize=64m
-XX:MaxPermSize=64m



再启动:发现没有full gc了只有数量比较多的minor gc,挑启动开始到启动完成的第一条和最后一条日志优化

引用
0.209: [GC 0.209: [DefNew: 4416K->511K(4928K), 0.0034707 secs] 4416K->614K(15872K), 0.0035239 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
….
6.383: [GC 6.383: [DefNew: 18880K->1985K(21184K), 0.0055311 secs] 46992K->30098K(68040K), 0.0055694 secs]


这6秒中GC日志打了69次, 而内存回收率仍是蛮高的 young区18880-1985=16895 jvm 46992-30098=16894 都快接近100%了,能够看出young区是由小到大在不断调整大小,因此不断GC,所以设一个初始值吧,听说设置heap的1/4比较好,那就是 128M,因此eclipse.ini加入ui

-Xmn128m



再重启,发现GC日志就四条了,eclipse启动天然快了

编码

引用
1.292: [GC 1.292: [DefNew: 104960K->10984K(118016K), 0.0334165 secs] 104960K->10984K(511232K), 0.0334603 secs] [Times: user=0.03 sys=0.00, real=0.03 secs]
2.182: [GC 2.182: [DefNew: 115944K->1852K(118016K), 0.0221714 secs] 115944K->11466K(511232K), 0.0222142 secs] [Times: user=0.00 sys=0.02, real=0.02 secs]
3.987: [GC 3.987: [DefNew: 106779K->12531K(118016K), 0.0378228 secs] 116393K->22145K(511232K), 0.0378692 secs] [Times: user=0.03 sys=0.00, real=0.03 secs]
5.377: [GC 5.377: [DefNew: 117491K->9403K(118016K), 0.0513728 secs] 127105K->31364K(511232K), 0.0514133 secs]



可是,启动后open个人多个项目,这些项目互相依赖,eclipse自动build,感受有点小卡,发现日志里多了4次full GC,因此就卡了…spa

引用
67.320: [Full GC (System) 67.320: [Tenured: 88847K->68809K(393216K), 0.2121213 secs] 117385K->68809K(511232K), [Perm : 41915K->41915K(65536K)], 0.2121747 secs] [Times: user=0.20 sys=0.00, real=0.20 secs]
103.759: [Full GC (System) 103.759: [Tenured: 81882K->66784K(393216K), 0.3287387 secs] 185350K->66784K(511232K), [Perm : 53464K->53414K(65536K)], 0.3287897 secs] [Times: user=0.33 sys=0.00, real=0.33 secs]



这个时候Tenured区和Perm都还没到很接近最大值,可是为何还有full GC呢,开始觉得是JVM悲观认为Tenured区剩余空间不足以应对下一次minor GC 因此进行了full GC调整Tenured空间,索性直接增长了堆最大值到-Xmx728m(工做电脑的内存是3.5G),但重启后full gc仍是有4次,并且有几回minor GC用的时间超过了0.1秒,这是由于增长了堆大小,致使GC用时也增长了,不能接受。因此仍是改回-Xmx512m。
再仔细观察日志,发现Full GC (System) 字样,这个意思是eclipse里调用了System.gc()手动触发了系统GC,好吧,哥已经给你分配足够空间了,你就省省吧,在eclipse.ini里加入:线程

-XX:+DisableExplicitGC



这样就差很少了,整个过程没有出现full gc,再编码2个小时,中间只出现了一次full gc,在open build某50W行+的代码的时候,eclipse仍是卡了…
最后又稍微调了一下各代的大小,获得目前的参数:

-Xms512m
-Xmx512m
-XX:PermSize=96m
-XX:MaxPermSize=96m
-Xmn168m
-XX:+DisableExplicitGC

另外没有去调GC策略,主要是以为eclipse是客户端程序,默认的client单线程的GC策略应该是比较适合的,之后有时间再试试看吧。

相关文章
相关标签/搜索