JVM角度调试优化MyEclipse
在将工作电脑的操作系统更换为win7之后,我的myeclipse的启动速度和运行速率一直很不理想。特别是在同时修改调试多个页面模板的时候,来回切换两个文件总是会卡个十来秒。试过关掉各种插件和验证也无济于事。于是在大致的研究完jvm后,决定从jvm的角度来试着解决这个问题。
启动优化:
首先来看下我的myeclipse.ini里面的默认启动参数:
-xmx512m :设置堆内存最大值为512m
-xx:maxpermsize=256m :设置持久代最大值为256m
-xx:reservedcodecachesize=64m :设置代码占用的内存大小为64m
从启动参数上看不出什么,于是往里面加入打印内存变化相关参数:
-xx:+printgctimestamps : 打印每次gc的时间戳
-xx:+printgcdetails : 打印每次gc的详细信息
-xloggc:myeclipsegc.log :将gc的记录输出到文件
-verbose:gc : 输出每次gc的相关情况
然后启动myeclipse,然后查看myeclipsegc.log里面的信息:
启动耗时大概在30秒左右,选择性的截取一小部分日志,可以看到,在myeclipse启动的前10秒内,jvm总共执行了300多次的gc和9次的full gc。
从gc频率和信息可以看出内存的回收率很高,且大小在不断调整,这应该是由于年轻代的空间不足导致,需要设定一个不小的初始值。
然后来重点关注full gc:
9.030: [full gc 9.030: [tenured: 53310k->52332k(64588k), 0.2034757 secs] 56020k->52332k(69516k), [perm : 43007k->42996k(43008k)], 0.2036030 secs] [times: user=0.20 sys=0.00, real=0.20 secs]
从两次日志的对比中可以看到,full gc主要是在回收tenured和perm这两个区域,并且这两个区域的大小都在不断的调整中,所以决定先把它们的大小固定下来。
于是调整后的参数如下:
-xms512m :设定堆的最小值为512m
-xmn192m : 设定年轻代的大小为192m
-xx:permsize=192m : 设定持久代的初始值为192m
-xx:maxpermsize=192m
-xx:reservedcodecachesize=64m
-xx:+printgctimestamps
-xx:+printgcdetails
-xloggc:myeclipsegc.log
-verbose:gc
重新启动一次myeclipse,查看日志信息:
启动耗时12秒左右,从日志可以看出,在前10秒内总共只进行了5次gc,不涉及各区域大小的调整,这个结果还是可以接受的,因为工作时不怎么需要频繁重启。
工作响应速度优化:
接下来研究困扰了我很久的来回切换html文件时的经常性延时和大卡问题,为了更直观的研究jvm的内存变化,决定借助jconsole这个java自带的辅助工具。先把myeclipse.ini的参数还原,避免被第一阶段的优化干扰。
启动myeclipse,启动jconsole并接入myeclipse所在的jvm,稳定后的整个堆的内存图如下:
接下来试着打开几个模板,然后观察内存的变化。
首先是堆内存的整体使用情况:
可以看到,在打开了几个模板之后,堆内存的使用从原先的100m以下突增至300m以上。使用量增加了三倍,但是还在我设置的512m范围之内。所以可以暂时不考虑继续增加堆内存,转而考虑调整各区内存大小比例问题。
于是观察下各个区在这段时间的内存使用情况,其中,eden区如下:
eden区在这段时间的内存使用率大增,且发生了多次gc。通过底下的监控信息可以知道,eden区在默认情况下只分配了31m的最大内存,这显然是不够用的。稍微执行点操作都会触发eden区的gc,这应该是模板打开切换发生延时卡顿的原因之一,需要调整。
接下来是tenured区:
jvm默认给这个区域分配的最大空间是470m。随着内存使用的变化,这个区域的实际大小一直在调整,每次区域大小的调整都会发生full gc,这应该是经常性大卡的原因之一。而新模板的打开是触发这种调整的主要原因。从这个区域内存的使用上来看,将这个区域的内存空间维持并固定在450m左右,保持一定的冗余还是有必要的。
从这点来看,jvm的堆内存还是有必要稍微扩充下以维持一个较大的tenured区和eden区。
最后来看下perm区:
作为方法区的一部分,这个区域的内存变化并不大,并且比较稳定,本来不需要留太多的冗余。但是考虑到当前打开的工程实际代码量并不大,决定暂时维持在128m左右,日后慢慢调整。
于是根据上面的分析将参数调整为:
-xmx768m
-xms768m
-xmn256m
-xx:permsize=192m
-xx:maxpermsize=192m
-xx:reservedcodecachesize=64m
重启myeclipse,接入jconsole,同时打开三十来个模板做了下测试。在观查各个区的内存使用率时发现一个问题,在将年轻代调整为256m以后,由于eden不再频繁的发生gc,进入 tenured区的数据量明显减少 ,tenured区的内存使用图如下:
如上图,在特意打开很多模板的情况下,450m+的空间只使用了不到250m,空间利用率太低,需再做调整。
总结
以上是我对自己的myeclipse进行调优的一些思路和实际调优的过程,在实际使用中又根据自己的喜好进行了一些调整定制,最终形成的myeclipse.ini的参数如下:
-vmargs
-xmx512m
-xms512m
-xmn192m
-xx:permsize=128m
-xx:maxpermsize=128m
-xx:reservedcodecachesize=64m
在这个参数设置下,myeclipse的响应速度比较有保证,各种延时卡顿的现象的出现频率大大降低。缺点是常驻的占用的系统内存偏高,喜欢同时打开多个myeclipse的同学可根据自己的需要和实际情况进行适当的调整。
以上就是本文的全部内容,希望能够对大家的学习有所帮助。