java应用占用内存过高排查的解决方案

作者:zhaixing_0307 时间:2023-09-21 12:47:30 

故障:收到服务器报警,内存使用率超过80%

1.查看

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

使用dstat

java应用占用内存过高排查的解决方案

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

使用top

java应用占用内存过高排查的解决方案

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

2.定位线程问题

使用ps查看16494的线程情况

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

java应用占用内存过高排查的解决方案

看到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

java应用占用内存过高排查的解决方案

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

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


parking to wait for <0x0000000085dce510>

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

5.代码优化

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

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

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

java应用占用内存过高排查的解决方案

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

java应用占用内存过高排查的解决方案

3、通过命令top -Hp PID 例如top -Hp 106854

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

java应用占用内存过高排查的解决方案

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

然后找到109391这个线程id

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

java应用占用内存过高排查的解决方案

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

java应用占用内存过高排查的解决方案

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

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

来源:https://blog.csdn.net/weixin_43931358/article/details/100516376

标签:java,内存高,排查
0
投稿

猜你喜欢

  • C#利用控件拖拽技术制作拼图游戏

    2023-05-24 21:27:34
  • java读取文件内容,解析Json格式数据方式

    2021-10-07 13:56:23
  • Android 滑动Scrollview标题栏渐变效果(仿京东toolbar)

    2023-11-21 23:56:29
  • 在VSCode里使用Jupyter Notebook调试Java代码的详细过程

    2022-03-25 07:14:12
  • java 学习笔记(入门篇)_java程序helloWorld

    2023-02-28 02:53:44
  • Spring Security账户与密码验证实现过程

    2023-03-04 21:54:37
  • C#修改IIS站点framework版本号的方法

    2023-08-29 19:14:13
  • springboot如何配置定时任务

    2021-06-22 09:16:12
  • android提取视频多张图片和视频信息实例

    2022-12-10 06:37:04
  • C#开发的人脸左右相似度计算软件源码分析

    2023-08-26 05:18:41
  • Spring AOP中的JDK和CGLib动态代理哪个效率更高?

    2023-07-02 18:42:50
  • SpringBoot Mybatis Plus公共字段自动填充功能

    2022-09-01 12:22:33
  • SpringMVC使用RESTful接口案例详解

    2022-08-08 23:41:52
  • java数据结构之java实现栈

    2023-11-25 05:32:36
  • 关于spring boot中几种注入方法的一些个人看法

    2022-09-07 10:15:14
  • SpringBoot 读取yml文件的多种方式汇总

    2023-08-03 13:10:43
  • Android AndFix热修复原理详情

    2023-03-02 09:17:07
  • 基于Kubernetes实现前后端应用的金丝雀发布(两种方案)

    2023-01-07 02:32:27
  • Java内存模型详解

    2023-06-21 21:04:29
  • java常用工具类之DES和Base64加密解密类

    2023-12-20 17:48:31
  • asp之家 软件编程 m.aspxhome.com