利用jvisualvm分析java虚拟机运行情况(解决项目中运行时间长久的问题)
程序员文章站
2022-07-15 14:46:12
...
前言
在平时的开发中,我们经常会遇到一个方法或者程序运行慢,卡住的问题,如果遇到数据量大的情况更加难以分析,此时就需要运用一些分析工具辅助我们去分析问题。
准备工具
- jdk自带的jvisualvm.exe
- eclipse
问题分析
在实际的项目中,程序长时间运行,最后报了OutOfMemoryError的内存溢出错误。由此展开问题分析:
尝试解决:
1.通过增加内存大小:
-Xmx10240m -Xms10240m -Xmn5120m -Xss512k
注释:
-Xmx :堆的最大值
-Xms :堆的最小值
-Xmn :堆年轻代大小
-Xss :栈大小(与栈深一起影响内存大小)
结果:并不生效。
2.打断点结合jvisualvm工具分析
打到相关类的方法断点,发现一直出不来,如图(省略相关类):
打开jvisualvm.exe工具,发现有个线程占用大部分时间,而其他线程在等待这个线程跑完,所以会造成程序运行时间太长无法结束的问题。
找到运行的程序,在监视处点堆Dump
进入堆栈运行列表:
此时发现有个线程一直在占用着。
最后研究代码发现,某个方法进入了while循环语句,一直在执行出不来,导致内存占用越来越大,最后虚拟机内存溢出。
修改代码解决问题。
结果:解决。
总结
在平时的一些异常出错情况下,要找到问题的根源才能对症下药,看似内存问题,但其实是栈的死循环问题导致的内存占用。多调试和跟踪,发现问题的本质,才是解决报错的王道。
附jvisualvm的简要说明:Java jvisualvm简要说明
上一篇: 共享内存+Shellcode实现跨进程调用3环函数
下一篇: Tomcat内存溢出问题排查分析