欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

利用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分析java虚拟机运行情况(解决项目中运行时间长久的问题)

打开jvisualvm.exe工具,发现有个线程占用大部分时间,而其他线程在等待这个线程跑完,所以会造成程序运行时间太长无法结束的问题。

找到运行的程序,在监视处点堆Dump
利用jvisualvm分析java虚拟机运行情况(解决项目中运行时间长久的问题)

进入堆栈运行列表:

利用jvisualvm分析java虚拟机运行情况(解决项目中运行时间长久的问题)

此时发现有个线程一直在占用着。

最后研究代码发现,某个方法进入了while循环语句,一直在执行出不来,导致内存占用越来越大,最后虚拟机内存溢出。
修改代码解决问题。

结果:解决。

总结

在平时的一些异常出错情况下,要找到问题的根源才能对症下药,看似内存问题,但其实是栈的死循环问题导致的内存占用。多调试和跟踪,发现问题的本质,才是解决报错的王道。

附jvisualvm的简要说明:Java jvisualvm简要说明