windows下查找java应用内存情况分析


https://blog.csdn.net/qq_14996421/article/details/115726673?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-115726673-blog-105843937.pc_relevant_paycolumn_v3&spm=1001.2101.3001.4242.1&utm_relevant_index=3

在65服务器上查看各java应用的内存占用情况,大多数应用的CPU占用都在1%-5%之间,但是nb-hes的内存占用长期达到了13%左右,遂开始排查nb-hes占用内存过分高的原因,具体步奏如下。

一、JConsole

排查65服务器上个java应用的内存占用情况

JConsole是JDK自带的一个工具,也是 一个图形界面的工具,只要装了JDK就有这个工具;可以直接在服务器上连接本地的java进程,也可以从本机去跟踪远程服务器上的一个进程,如下图所示:

image-20220615194250948

点击连接即可

image-20220615194903776

确认连接

image-20220615195009791

服务器上面的基本情况如下:

image-20220615195315959

可以看到CPU占用比较高

二、使用任务管理器查询应用所在详情(PID、安装位置)

image-20220615200142459

image-20220615200343473

三、使用Jstack下载stack信息到某个位置

使用Jstack将第二步查询到的PID对应的应用的stack信息下载下来

image-20220615195812485

四、 Process Explorer

用的是微软提供的 Process Explorer工具,排查上一步查询的进程当中,那个线程所占用的内存最多。

image-20220615201109069

五、找到占用内存多的那段代码

由于stack导出的信息里面线程对应的tid是16进制的,所以要把前面的线程的TID转成16进制的,再在stack导出的文件当中全局搜索该PID(9726—>25FC)

image-20220615201211363

六、分析

在代码当中查找该段代码,发现是由于引入的第三方的这个Jar包里面写了一个死循环,去一直监听设备的上线下

image-20220615201654127

为了验证是否是死循环引起的,现在修改代码不做成死循环

image-20220616093046466

打包后重新运行程序,再次测试内存占比,情况如下

image-20220702135156318

由此确定,确实是由于这段代码引起的!


文章作者: superzqbo
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 superzqbo !
评论