java应用占用内存过高排查的解决方案
作者:zhaixing_0307 发布时间:2023-09-21 12:47:30
故障:收到服务器报警,内存使用率超过80%
1.查看
使用dstat和top查看内存使用最高的应用
使用dstat
查到内存占用最高的是java应用,使用2253M内存,但是这台服务器跑了好几个java,具体哪个进程使用top看下资源情况
使用top
可以看到java应用整体内存使用率超过了70%,其中pid为16494的进程 一个应用占了28.7的内存
2.定位线程问题
使用ps查看16494的线程情况
命令:ps p 16494 -L -o pcpu,pmem,pid,tid,time,tname,cmd
看到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
可以看到这个线程状态为WAITING
通过查看日志发现有大量的 waiting on condition
parking to wait for <0x0000000085dce510>
存在大量线程等待被唤醒,占用大量内存
5.代码优化
将相应日志发送给相应开发,优化线程
补充:分析java线程占用cpu或者内存高的代码
1、通过top查看占用cpu或者内存高的进程截图如下【备注输入大写P以cpu从大到小排序,大写M以内存大小排序】
2、通过对应的cpu找到PID也就是进程对应的pid,然后找到java进程106854这个进程id
3、通过命令top -Hp PID 例如top -Hp 106854
就可以列出该进程下的所有线程id
4、通过输出大写的P查看线程占用cpu最高的或者通过大写M查看内存占用最高的
然后找到109391这个线程id
5、使用命令printf “%x\n” 109391 输出对应的十六进制码,1ab4f这个码是为了过滤线程id查到对应的代码
6、使用命令jstack PID|grep 1ab4f 【备注PID是进程的id,1ab4f是这个进程下的一个线程占用最高的cpu十六进制码】
7、通过上面的输出发现kafka,所以会联想到,kafka一直监听消息,所以消耗cpu,正常现象
8、如果出现自己写的类,说明需要修改代码逻辑了
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。
来源:https://blog.csdn.net/weixin_43931358/article/details/100516376
猜你喜欢
- 由于byte是一个8位字节所以可以用它来存放数组为8的boolean数组,这些在通信协议会经常用到。这里给出一个java代码对其互相转换的。
- 网上各种解决方案,我试了好久,整合了几篇文章才凑出来,在这里分享一下,实在不想网友们在这里面绕圈子,毕竟,写代码的时间是愉快的,解决bug也
- 带返回值的方法练习需求: 设计一个方法可以获取两个数的较大值,数据来自于参数思路:1. 定义一个方法,用于获取两个数中的较大数public
- 1、0前言最近在学习 Go 语言,Go 语言中有指针对象,一个指针变量指向了一个值的内存地址。学习过 C 语言的猿友应该都知道指针的概念。G
- Maven工程pom定义jdk版本今天把之前做的项目导进eclipse,然后发现报错,一些类在1.6中不支持,需要将JDK版本设置为1.7,
- 与任何程序设计语言一样,Java使用条件语句和循环结构确定控制流。本文将简单讲解条件、循环和switch。一、块作用域块(block),即复
- 引言从本篇文章开始,我们将介绍 Java AQS 的实现方式,本文先介绍 AQS 的内部数据是如何组织的,后面的文章中再分别介绍 AQS 的
- Java8Stream流操作List去重根据属性去重整体去重使用distinctArrayList<LabelInfoDTO>
- Java.util.Collections类下有一个静态的shuffle()方法,如下:1)static void shuffle(List
- 本文以spring-boot-maven-plugin 2.5.4为例@Mojo defaultPhase以spring-boot-mave
- springboot集成开发实现商场秒杀加入主要依赖<dependency> <groupId>org.spring
- 泛型中 T 类型变量 和 ? 通配符 区别定义不同 :T 是类型变量,? 是通配符使用范围不同:? 通配符用作 参数类型、字段类型、局部变量
- Java读取json数据并存入数据库1. pom依赖<dependency> &nbs
- Java数组声明、创建、初始化一维数组的声明方式:type var[]; 或type[] var;声明数组时不能指定其长度(数组中元素的个数
- 首先创建一个用户控件 如下图 用到的控件 label、button、TextBox 内部代码如下#region 分页字段和属性pr
- 一、线程的优先级别线程优先级别的使用范例:package cn.galc.test;public class TestThread6 { p
- 一、利用Web服务中的JavaScriptSerializer 类System.Web.Script.Serialization空间,位于S
- 背景:新需求需要引入新jar包,引入后发现本地启动没有报错,发到测试环境提示某个bean无法创建,nested exception is j
- ContentProvider是内容提供者,可以跨进程提供数据。大家都知道,ContentProvider的启动,是在Application
- 任何一个类都是Class类的实例对象,这个实例对象有三种表示方式第一种表示方式(任何一个类都有一个隐含的静态成员变量class):Class