jvm常用调优工具有:Jconsole,jProfile,VisualVM
Jconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用。对垃圾回收算法有很详细的跟踪。详细说明参考这里
JProfiler:商业软件,需要付费。功能强大。
VisualVM:JDK自带,功能强大,与JProfiler类似,推荐。
一般情况下调优都会首先看算法,多线程,集群。也就是常说的我们优化,首先要考虑的就是代码的优化,我原来遇到一个问题,一个经常提供服务的系统必须一天自动重启一次,还要手动GC,否则其他的系统就无法调用这个系统的服务,而且抛出的异常也是out of momery,是一个很常见的错误,我们这样开始分析。
代码
首先,我们用VisualVM进行查看发现,将推内存dump下来
发现底层实例化了很多hashmap
hashmap每次创建都会有缓存,当我们就将hashmap去掉后发现依然会抛出out of memory,只不过时间延长了,比原来没有去掉更晚抛出oom,治标不治根,我们用这个框架的同时,还有其他项目也用了这个框架,但是他们那个项目却没有出现这个问题,于是比较不同,发现我们的项目因为比较大,所以用的标签@ManytoOne比较多,当我们把这个标签用其他的方式替换后,发现不再抛出oom的错误,所以验证了第一点,代码的重要性,我们所有关于调优的出发点都是先看代码,因为代码是多人合作开发,每个人的习惯不同,可能会有各种各样的问题。
有了堆信息查看方面的功能,我们一般可以顺利解决以下问题:
–年老代年轻代大小划分是否合理
–内存泄漏
–垃圾回收算法设置是否合理
多线程
还是通过工具进行查看:
根据工具我们可以监控到以下的信息:
线程信息监控:系统线程数量。
线程状态监控:各个线程都处在什么样的状态下
总结
调优是一个比较大的概念,oom的情况有好多,比如是堆溢出?还是栈溢出?再比如stackoverflow,又是怎样发现的?这些情况的发生原因比较多变,我们可以通过工具来分析,但是又有个问题,如果现在是在生产环境上产生这个问题,因为这些工具非常耗资源,所以为了不影响生产环境,那又得用其他方式是检测,怎么做呢?