java应用占用内存过高如何解决?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、WEB应用程序
java应用占用内存过高如何解决?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
Java是一门面向对象编程语言,可以编写桌面应用程序、WEB应用程序、分布式系统和嵌入式系统应用程序。
查看
使用dstat和top查看内存使用最高的应用
使用dstat
查到内存占用最高的是java应用,使用2253M内存,但是这台服务器跑了好几个java,具体哪个进程使用top看下资源情况
使用top
可以看到java应用整体内存使用率超过了70%,其中pid为16494的进程 一个应用占了28.7的内存
使用ps查看16494的线程情况
命令:ps p 16494 -L -o pcpu,pmem,pid,tid,time,tname,cmd
看到16494这个pid的应用产生了很多线程。
使用jstack查看
我们挑选了TID=17417的线程进行分析
在分析前需要将17417这个id转换为16进制,方便查找信息
[root@localhost ~]# printf "%x\n" 174174409
16进制为4409
将pid为16494的应用打印到日志中
[root@localhost ~]# jstack -l 16494 > jstack.log
[root@localhost ~]# vim jstack.log
在日志信息中查找刚刚转换的4409
可以看到这个线程状态为WaiTING
通过查看日志发现有大量的 waiting on condition
parking to wait for <0x0000000085dce510>
存在大量线程等待被唤醒,占用大量内存
将相应日志发送给相应开发,优化线程
补充:分析java线程占用cpu或者内存高的代码
通过top查看占用cpu或者内存高的进程截图如下【备注输入大写P以cpu从大到小排序,大写M以内存大小排序】
通过对应的cpu找到PID也就是进程对应的pid,然后找到java进程106854这个进程id
通过命令top -Hp PID 例如top -Hp 106854
就可以列出该进程下的所有线程id
通过输出大写的P查看线程占用cpu最高的或者通过大写M查看内存占用最高的
然后找到109391这个线程id
使用命令printf “%x\n” 109391 输出对应的十六进制码,1ab4f这个码是为了过滤线程id查到对应的代码
使用命令jstack PID|grep 1ab4f 【备注PID是进程的id,1ab4f是这个进程下的一个线程占用最高的cpu十六进制码】
通过上面的输出发现kafka,所以会联想到,kafka一直监听消息,所以消耗cpu,正常现象
如果出现自己写的类,说明需要修改代码逻辑了
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网精选频道,感谢您对编程网的支持。
--结束END--
本文标题: java应用占用内存过高如何解决
本文链接: https://www.lsjlt.com/news/247920.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0