java内存监控工具有哪些?java内存过高怎么排查?

阳光 2022-05-30 16:35:55 java常见问答 8785

在进行java开发,我们需要监控java内存情况,不然java内存过高就会导致无法正常运行,那java内存监控工具有哪些?下面来我们就来给大家讲解一下java内存监控工具的相关内容。

jinfo:可以输出并修改运行时的java 进程的opts。

jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。

jstat:一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。

jmap:打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。

jconsole:一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。

jprofiler:是一个非常优秀的内存监控工具,可以监控tomcat、eclipse等

java内存过高怎么排查?

1.查看

使用dstat和top查看内存使用最高的应用

使用dstat

java内存监控工具有哪些?java内存过高怎么排查?.jpg

查到内存占用最高的是java应用,使用2253m内存,但是这台服务器跑了好几个java,具体哪个进程使用top看下资源情况

使用top

1.jpg

可以看到java应用整体内存使用率超过了70%,其中pid为16494的进程 一个应用占了28.7的内存

2.定位线程问题

使用ps查看16494的线程情况

命令:ps p 16494 -l -o pcpu,pmem,pid,tid,time,tname,cmd

2.jpg

看到16494这个pid的应用产生了很多线程。

3.查看内存使用的堆栈

使用jstack查看

我们挑选了tid=17417的线程进行分析

在分析前需要将17417这个id转换为16进制,方便查找信息

[root@localhost ~]# printf "%x\n" 17417
4409

16进制为4409

将pid为16494的应用打印到日志中

[root@localhost ~]# jstack -l 16494 > jstack.log

4.查看内存堆栈信息

[root@localhost ~]# vim jstack.log

在日志信息中查找刚刚转换的4409

3.jpg

可以看到这个线程状态为waiting

通过查看日志发现有大量的 waiting on condition

parking to wait for <0x0000000085dce510>

存在大量线程等待被唤醒,占用大量内存

5.代码优化

将相应日志发送给相应开发,优化线程

补充:分析java线程占用cpu或者内存高的代码

1、通过top查看占用cpu或者内存高的进程截图如下【备注输入大写p以cpu从大到小排序,大写m以内存大小排序】

4.jpg

2、通过对应的cpu找到pid也就是进程对应的pid,然后找到java进程106854这个进程id

5.jpg

3、通过命令top -hp pid 例如top -hp 106854

就可以列出该进程下的所有线程id

6.jpg

4、通过输出大写的p查看线程占用cpu最高的或者通过大写m查看内存占用最高的

然后找到109391这个线程id

5、使用命令printf “%x\n” 109391 输出对应的十六进制码,1ab4f这个码是为了过滤线程id查到对应的代码

7.jpg

6、使用命令jstack pid|grep 1ab4f 【备注pid是进程的id,1ab4f是这个进程下的一个线程占用最高的cpu十六进制码】

8.jpg

7、通过上面的输出发现kafka,所以会联想到,kafka一直监听消息,所以消耗cpu,正常现象

8、如果出现自己写的类,说明需要修改代码逻辑了

出现java内存过高的时候,我们一定要及时去排查,及时去解决内存过高的问题,不然java内存过高就会导致无法正常运行,影响我们开发进度哦!最后大家如果想要了解更多java常见问答知识,敬请关注奇Q工具网。

推荐阅读:

Java就业要掌握什么?java就业培训要多久?

springboot框架工作原理及流程是什么?详情介绍

java集合有哪些方法?Java集合能干嘛?