首页 > 系统相关 >java进程占用系统内存高,排查解决 _

java进程占用系统内存高,排查解决 _

时间:2023-08-03 14:45:04浏览次数:64  
标签:java jstack 排查 9718 线程 内存 进程

java进程占用系统内存高,排查解决 _  

故障:今天许多开发反馈测试平台卡,访问不了,第一感觉判断是服务器内存爆了,或者cpu占用过高,上服务器看了一下,确实是内存爆了。然后开始定位问题原因,因为阿里这边安全的原因,具体的图片就不方便上传了,拿网上的图来说

 

  1. 使用top命令查看系统资源的使用情况,命令:top

    image.png


    如图可以看到java的进程内存使用率较高,java进程的内存使用率达到了70%+

 

2.定位线程问题(通过命令查看9718进程的线程情况),命令:ps p 9718 -L -o pcpu,pmem,pid,tid,time,tname,cmd

 image.png

 

由此可以看到这PID:9718的进程产生了很多线程。接下来就可以通过jstack查看内存使用的堆栈。

 

3. 查看内存使用的堆栈:在这里我们挑选了TID=9731的线程进行分析,首先需要将9731这个id转换为16进制。需输入如下命令,

 

printf "%x\n" 9731

 

image.png

 

接下需要使用16进制的2603

 

4. 将PID为9718的堆栈信息打印到jstack.log中,命令:jstack -l 9718 > jstack.log

 

  image.png

 

5. 查看堆栈信息文件,命令:vim jstack.log

 

  在进行搜索TID为2603的相关信息。如图:

 

  image.png

 

  可以看到这个线程状态为:WAITING。通过查看文件分析 看到大量 Java Thread State。

  说明它在等待另一个条件的发生,来把自己唤醒,或者干脆它是调用了 sleep(N)。

  此时线程状态大致为以下几种:

  java.lang.Thread.State: WAITING (parking):一直等那个条件发生;

  java.lang.Thread.State: TIMED_WAITING (parking或sleeping):定时的,那个条件不到来,也将定时唤醒自己。

 

6.代码优化:将文件发送给开发。优化下线程

 

 

 

这里还有一种排查思路

 

在定位到具体的PID后,可以到处进程快照,看看这个线程做了啥

1

jstack -l 9718 > ./9718.stack

 

再用grep查看下线程在文件里做了啥

1

cat 9718.stack |grep '2603' -C 8

 

这里随便定位一个,基本上这样查都可以定位到线程的问题

标签:java,jstack,排查,9718,线程,内存,进程
From: https://www.cnblogs.com/iancloud/p/17603295.html

相关文章

  • 老杜 JavaWeb 讲解(十八) ——项目优化(Servlet+JSP+EL+JSTL)
    (十六)项目优化(Servlet+JSP+EL+JSTL)相关视频:55-EL表达式JSTL和base标签改造OA新旧代码对比:注意点:Java代码不需要改动,只需要更改jsp代码。将需要的包导入:jakarta.servlet.jsp.jstl-2.0.0.jarjakarta.servlet.jsp.jstl-api-2.0.0.jarmysql-connector-j-8.0.31.j......
  • 深入浅出RxJava (四:在Android中使用响应式编程)
    [url=http://blog.danlew.net/2014/10/08/grokking-rxjava-part-4/]原文链接[/url]在第1,2,3篇中,我大概介绍了RxJava是怎么使用的。下面我会介绍如何在Android中使用RxJava.RxAndroidRxAndroid是RxJava的一个针对Android平台的扩展。它包含了一些能够简化And......
  • Linux下安装Java环境三种方式(tar.gz、rpm、yum)
    一:Java软件包下载Java各版本下载地址;进入页面后我们首先看到的是Java最新版本的下载界面,但是在这我需要下载Java8的版本,所以得划到下面的界面,即界面如下:在这里我将下载:jdk-8u381-linux-x64.tar.gz(压缩包方式安装)、jdk-8u381-linux-x64.rpm(RPM方式安装)注:在下载界面的下面......
  • JavaScript ES5模块导入ES6区别
    JavaScriptES5模块导入ES6区别   ES6引入了原生的模块系统,使用import和export关键字来导入和导出模块。ES6模块系统相比ES5的导入方法具有以下几个区别: 1.语法不同:-ES5:使用Require.js或CommonJS,通过`require`方法导入模块。-ES6:使用import关键字导入模块。 2......
  • C#调用Java MD5加密 转换成base64编码
    publicbyte[]GetUTF8(stringcontent){byte[]bytes=Encoding.UTF8.GetBytes(content);returnbytes;}publicbyte[]GetHash(byte[]sources){MD5CryptoServiceProviderMD5CSP=newMD5CryptoS......
  • Linux:安装Java以适配tomcat
    学习自:Tomcatv8.5.82搭建_幼儿园的扛把子!!的博客-CSDN博客怎样查看和tomcat对应匹配的最低jdk版本-百度经验1、查看tomcat适配的Java版本tomcat官网https://tomcat.apache.org/download-80.cgi,点击whichversion 我下载的tomcat是8.5.52,可以看到最后一列,支持的Java版本为......
  • c的内存管理
    C的内存管理C语言为内存的分配和管理提供了几个函数。这些函数可以在<stdlib.h>头文件中找到。在C语言中,内存是通过指针变量来管理的。指针是一个变量,它存储了一个内存地址,这个内存地址可以指向任何数据类型的变量,包括整数、浮点数、字符和数组等。C语言提供了一些函数和运......
  • JavaScript学习 -- RSA算法应用实例及公钥私钥的生成方法
    正文:RSA算法是一种非对称加密算法,用于加密、解密和数字签名等场景。本文将介绍如何在JavaScript中使用RSA算法,并提供一个实际的案例,同时也会说明如何生成公钥和私钥。首先,确保您已经引入了jsencrypt库。以下是一个使用RSA算法进行加密和解密的示例,同时也包含了公钥和私钥的生成方法......
  • 记一次 .NET某培训学校系统 内存碎片化分析
    一:背景1.讲故事前些天有位朋友微信上找到我,说他们学校的Web系统内存一直下不去,让我看下到底是怎么回事,老规矩让朋友生成一个dump文件丢给我,看一下便知。二:WinDbg分析1.托管还是非托管要想看托管还是非托管,可以用!address-summary观察下内存段。0:000>!address-summ......
  • Java Word转为PNG
    主要代码逻辑//判断生成路径FilefileDir=newFile("./generatePng");if(!fileDir.exists()){fileDir.mkdirs();}StringworkPermitId=唯一标识;Documentdoc=newDocument(word文档路径);if(doc.getPageCount()>1){//多张for(inti=0;i<doc.......