生产排查jvm内存溢出问题的高效方式:
需要工具:VisualVm2.0.3、百度搜索下载arthas可以找到阿里旗下的arthas官网(arthas里的jar包下载到服务器某个目录下)
1、curl -O https://arthas.aliyun.com/arthas-boot.jar
2、然后执行命令(java -jar arthas-boot.jar)
3、执行jar包命令后会出现服务器上所有的jar包,选择1或者2等选择需要查看的应用jar包,然后enter回车就会进入arthas用户下查看具体的jvm
4、输入dashboard 仪表看可以看到生产的堆栈原空间等信息,看不到具体的类
5、把具体的jvm内存信息下载成.hprof的文件,命令:heapdump /tmp/dump-1.hprof (下载到文件服务器的tmp目录下后再下载到本地用VisualVm工具分析)
6、下载好VisualVM工具,在bin目录下找到,打开VisualVM.exe,加载dump-1.hprof文件分析
7、主要看哪个类在占用的内存最大,找到最大的的类右键在新的标签页打开,会出现很多节点,只需要随机取第一个节点选中,点击按钮GC Root,查看根节点
这时候就能看见哪个类有问题,然后再选中这个类,右键select in threads,既可以查到这个类应该的方法报错,然后根据本地代码去排查
8、排查完成后,再用VisualVM监控下当前应用,看看Sampler样例的Memory内存的Heap堆的列表图里内存实时的使用情况,执行一次GC,看看内存是否可以回收
如果可以回收,既问题解决,之前的是因为没有关闭OSS连接所以无法回收,关闭后就可以回收了,堆内存就恢复正常。