java系统性能优化(七)- JVM参数调优

前面说了怎样合理的找到系统的瓶颈,解决系统的问题,这时候系统应该比较健康了,如果还想要进一步压榨系统的性能,就必须从一些参数下手,而调整参数实在是一件事半功倍的事情。

JVM参数调优总的来讲主要分两个方面:1.代大小的调优 2.垃圾回收机制的调优。主要的调优方向也是两个:减少full gc次数,减少每次gc所使用的时间。

调jvm参数很有用的一个工具是jstat,用起来也很简单,最常用的命令是jstat -gcutil [jvmpid] [刷新时间]

比如打开eclipse 然后执行

jstat -gcutil 5064 1000
5064是eclipse当前的进程ID,-gcutil是gc情况集合, 1000是每秒输出一次
可以看到这样的数据
S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
20.05   0.00  42.44  11.15  52.98      4    0.486     0    0.000    0.486
20.05   0.00  42.44  11.15  52.98      4    0.486     0    0.000    0.486
各列分别是S0,S1,Eden,Old,Perm这几个主要区的大小,后面是minorGC次数,消耗时间,FullGC次数,消耗时间,消耗总时间这几项。
有了这个工具就可以评估当前GC的情况和我们JVM参数调优的效果了。另外还可以通过打印GC的详细日志来分析GC,参数-Xloggc:gc.log
首先是代大小调优,一般我们都会将JVM的-Xms和-Xmx设定为相同的值,这样可以避免JVM频繁的调整heap区的大小,而带来的性能损耗。然后是新生代的大小,也就是-Xmn这个值,如果设置的太小,则可能会频繁进行minorGC,并且有可能会因为对象比较大而导致对象没来的及被回收就直接进入了旧生代,旧生代大小增加后触发FullGC。根据实际情况,比如缓存的数据比较多,还可以给Perm区设置的大一点。一般这几项设置就够了,调优过程中,通过不断的修改参数,重新测试,观察jstat的结果,再回归调优就可以得到比较理想的代大小设置了。
代大小调优可以参考我之前的eclipse调优
GC策略调优,新版本的JVM提供的G1回收策略是目前最受关注的,但他还很不稳定,暂时不要用在生产环境。服务器一般默认是并行回收GC,也就是-XX:+UseParallelGC,这种情况会使用等于CPU核数的线程数进行GC回收。对于并发量比较大的可以采用CMS并发GC策略,可以大大缩短GC时使用的时间,但是这种方式会产生一些内存碎片,配置的参数比较复杂,可以参考这篇文章:http://www.javaeye.com/topic/473874
总之,JVM调优只要遵循上面的原则,通过反复的修改参数,分析修改后的GC运行情况,就可以得到比较合适的参数了。另外,使用新版本的JDK也可以获得一定的整体性能提升。

1 Comments.

Leave a comment
  1. I believe everything typed made a bunch of sense. However, think about this, what if you composed a catchier title? I ain’t saying your information isn’t solid., however what if you added a title that makes people want more? I mean java蝟餌??扯隡?嚗?嚗? JVM?靚? | beralee????is kinda vanilla. You could peek at Yahoo’s home page and watch how they create post headlines to grab viewers to click. You might try adding a video or a pic or two to grab readers interested about what you’ve written. In my opinion, it would make your posts a little livelier.

Leave a Reply

( Ctrl + Enter )