VisualVM:多合一故障处理工具,功能比较全面的一个工具,与其它的检测工具相比,对实际性能影响很小,并且还具备安装插件功能。这个工具和前面介绍的JConsole工具有很多类似的功能,但是比JConsole功能更全面,朋友们可以自己到JDK的bin目录下找到jvisualvm.exe进行测试。

使用VisualVM 排查java内存泄露和溢出_可视化工具

这里简单介绍两个比较有用的插件。

一个是Visual GC,可以堆内存的使用有一个更全面的监控,包括类的编译,加载,垃圾收集,内存使用都有一个更直观的展现。

使用VisualVM 排查java内存泄露和溢出_jvm_02

另一个是BTrace动态日志跟踪,可以在不影响程序运行的情况下,添加代码,对运行中的程序内容进行监控。

(右键点击要操作的应用进程,在弹出的页面选择Trace Application,进入BTrace面板)

使用VisualVM 排查java内存泄露和溢出_VisualVM_03

插件的安装可以直接打开“菜单-插件”,然后在弹出的界面中“可用插件”栏选中自己想要安装的插件,然后点击安装,安装完成后重新启动就可以了。

使用VisualVM 排查java内存泄露和溢出_虚拟机_04

书中的第五章介绍了一些调优案例,这里就不一一介绍了,有时间的朋友推荐看一看,笔者看完之后还是有蛮多收获的。

根据实际的项目经历和体会,整理了以下几点:

1. 并不是程序运行的堆设置的越大越好;缺点:堆设置的越大,会导致垃圾收集需要处理的对象越多,反而停顿的时间越长。

为了不浪费硬件资源,可以考虑集群部署,将每个应用程序分配一个相对较合适的堆空间。

另外,这里还提到了一个问题,那就是64位的JDK比32的JDK,64位和32位支持的内存容量。32位性能更好

2. 对应集群部署的应用,当访问量比较大的时候,由于网络等原因同步失败,一般的情况下,同步失败将会进行重试,大量的重发数据积累在堆中,导致堆内存溢出。

3. 如果程序中存在频繁的调用本地方法的操作,比如IO操作等,这个时候会使用直接内存,当调用本地方法不注意内存的及时关闭等,也会出现直接内存的溢出情况。

4. 当服务程序需要调用其它系统的接口时,由于对方系统访问速度较慢,导致积压了大量的服务没有完成,这个有点类似于第二条,也会导致虚拟机进程崩溃。