首页 > 系统相关 >linux下分析java程序占用CPU、内存过高

linux下分析java程序占用CPU、内存过高

时间:2023-04-26 18:03:13浏览次数:42  
标签:java dump Generation 内存大小 线程 内存 linux CPU

转:https://www.cnblogs.com/wu-wu/p/11923250.html

 

CPU过高分析

1)使用TOP命令查看CPU、内存使用状态可以发现CPU占用主要分为两部分,一部分为系统内核空间占用CPU百分比,一部分为用户空间占用CPU百分比。其中CPU状态中标示id的为空闲CPU百分比。当空闲CPU百分比越低,说明CPU占用率越高。

2)目前针对Linux下java进程占用CPU高的分析手段主要为使用linux命令查出高CPU使用的进程,前分析其是由于进程原因还是系统原因,在分析出为进程消耗过高CPU后列出占用CPU高和占用时间最长的线程并使用jdk自带的jstack工具进行分析CPU使用分析。

jstack命令

通过top命令定位到cpu占用率较高的线程之后,继续使用jstack pid命令查看当前java进程的堆栈状态

参数说明:
  • -l 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent 的 ownable synchronizers列表.
  • -F 当’jstack [-l] pid’没有相应的时候强制打印栈信息
  • -m 打印java和native c/c++框架的所有栈信息.
  • -h | -help 打印帮助信息
jstack命令生成的thread dump信息包含了JVM中所有存活的线程,为了分析指定线程,必须找出对应线程的调用栈,应该如何找?在top命令中,已经获取到了占用cpu资源较高的线程pid,将该pid转成16进制的值,在thread dump中每个线程都有一个nid,找到对应的nid即可;隔段时间再执行一次stack命令获取thread dump,区分两份dump是否有差别,在nid=0x246c的线程调用栈中,发现该线程一直在执行JstackCase类第33行的calculate方法,得到这个信息,就可以检查对应的代码是否有问题。

 

通过thread dump分析线程状态:除了上述的分析,大多数情况下会基于thead dump分析当前各个线程的运行情况,如是否存在死锁、是否存在一个线程长时间持有锁不放等。在dump中,线程一般存在如下几种状态:1、RUNNABLE,线程处于执行中2、BLOCKED,线程被阻塞3、WAITING,线程正在等待实例1:多线程竞争synchronized锁

很明显:线程1获取到锁,处于RUNNABLE状态,线程2处于BLOCK状态1、locked <0x000000076bf62208>说明线程1对地址为0x000000076bf62208对象进行了加锁;2、waiting to lock <0x000000076bf62208> 说明线程2在等待地址为0x000000076bf62208对象上的锁;3、waiting for monitor entry [0x000000001e21f000]说明线程1是通过synchronized关键字进入了监视器的临界区,并处于"Entry Set"队列,等待monitor。

内存过高分析

使用pmap查看进程内存

命令格式:

pmap 进程id

 

通过thread dump分析线程状态:除了上述的分析,大多数情况下会基于thead dump分析当前各个线程的运行情况,如是否存在死锁、是否存在一个线程长时间持有锁不放等。在dump中,线程一般存在如下几种状态:1、RUNNABLE,线程处于执行中2、BLOCKED,线程被阻塞3、WAITING,线程正在等待实例1:多线程竞争synchronized锁

很明显:线程1获取到锁,处于RUNNABLE状态,线程2处于BLOCK状态1、locked <0x000000076bf62208>说明线程1对地址为0x000000076bf62208对象进行了加锁;2、waiting to lock <0x000000076bf62208> 说明线程2在等待地址为0x000000076bf62208对象上的锁;3、waiting for monitor entry [0x000000001e21f000]说明线程1是通过synchronized关键字进入了监视器的临界区,并处于"Entry Set"队列,等待monitor。

内存过高分析

使用pmap查看进程内存

命令格式:

pmap 进程id

 

第一列。内存块起始地址

第二列。占用内存大小

第三列,内存权限

第四列。内存名称。anon表示动态分配的内存,stack表示栈内存

最后一行。占用内存总大小,请注意,此处为虚拟内存大小,占用的物理内存大小能够通过top查看

使用jmap查看Java进程对象使用情况

命令格式:

jmap -histo 进程id

 

第一列,序号。

第二列,对象实例数量

第三列,对象实例占用总内存数。单位:字节

第四列,对象实例名称

最后一行,总实例数量与总内存占用数

使用jstat查看Java内存分布及回收情况

通常运行命令如下:

jstat -gc 15712 5000

即会每5秒一次显示进程号为15712的java进成的GC情况,

 

- S0C: Young Generation第一个survivor space的内存大小 (kB).

- S1C: Young Generation第二个survivor space的内存大小 (kB).

- S0U: Young Generation第一个Survivor space当前已使用的内存大小 (kB).

- S1U: Young Generation第二个Survivor space当前已经使用的内存大小 (kB).

- EC: Young Generation中eden space的内存大小 (kB).

- EU: Young Generation中Eden space当前已使用的内存大小 (kB).

- OC: Old Generation的内存大小 (kB).

- OU: Old Generation当前已使用的内存大小 (kB).

- MC: Permanent Generation的内存大小 (kB)

- MU: Permanent Generation当前已使用的内存大小 (kB).

- YGC: 从启动到采样时Young Generation GC的次数

- YGCT: 从启动到采样时Young Generation GC所用的时间 (s).

- FGC: 从启动到采样时Old Generation GC的次数.

- FGCT: 从启动到采样时Old Generation GC所用的时间 (s).

- GCT: 从启动到采样时GC所用的总时间 (s).

 

标签:java,dump,Generation,内存大小,线程,内存,linux,CPU
From: https://www.cnblogs.com/qsds/p/17356867.html

相关文章

  • Linux 字体管理相关操作
    查看已经安装的字体fc-list#提示不是命令则先安装包fontconfigyum-yinstallfontconfig下载党政机关字体党政机关字体提取码:xixv在进入目录/usr/share/fonts/winfonts没有则创建,刷新字体库sudofc-cache–fv再次查看已经安装的字体fc-list/usr/shar......
  • java连接jdbc-mssql数据库
    packagecom.swift.erp;importjava.sql.SQLException;importjava.sql.Statement;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;publicclassAPP{//引入sqljdbc.jarpublicstaticvoidmain(String[]args......
  • java excel带图片导入
    日常项目中使用easyExcel但是easyExcel不支持带图片的excel导入,后面通过网络查找,再加上询问技术经理终于解决,大前提是图片在excel中不是嵌入的,需要悬浮才可以读取。代码如下引用jar包为<!--需要2.10版本及以上不然excel缺少工具类--><dependency><groupId>com......
  • java程序执行exe脚本文件
    一、新建bat脚本文件,并写入执行exe脚本命令: 二、执行bat脚本:1StringfullPath="E:\\model-script\\ComSim-master.bat";2Filefile=newFile(fullPath);3if(file.exists()){//如果已存在,删除旧文件4file.delete();5......
  • linux防火墙查看状态firewall、iptable
    原文地址blog.csdn.netiptables防火墙1、基本操作`1.#查看防火墙状态2.serviceiptablesstatus4.#停止防火墙5.serviceiptablesstop7.#启动防火墙8.serviceiptablesstart10.#重启防火墙11.serviceiptablesrestart13.#永久......
  • java连接数据库的5种方式
    方式一直接导入第三方库驱动类这种加载方式在jdbc入门时已经用过,这个driver属于第三方库,。为静态加载,灵活性差,依赖性抢方式二使用反射机制获取方式一和方式二代码packagecom.hsp.edu;importcom.mysql.cj.jdbc.Driver;importjava.lang.reflect.Constructor;import......
  • Java程序部署成Windows服务
    大多数时候部署Java程序时,都是简单弄一个控制台,一是简单,二是能很方便监测运行是否正常。但如果是在服务器上部署这种模式就不可取,假设服务器重启了,重启之后不登录到远程桌面的话,即使把启动命令放到启动项,也不会自动运行。另一个问题就是,针对WindowsServer2008以后的操作系统,控制......
  • Java中关于String类以及字符串拼接的问题
    String类部分源码//被final修饰不可被继承publicfinalclassStringimplementsjava.io.Serializable,Comparable<String>,CharSequence{//String维护char[]所以不可修改privatefinalcharvalue[];创建String对象的方式str1它首先会去方法区的常量池......
  • Java通过反射给final对象赋值(代码库)
    直接赋值会报错Methodthrew'java.lang.UnsupportedOperationException'exception.给没有set方法的类如下赋值publicstaticvoidsetFieldValue(Objectobj,StringfieldName,Objectval){if(isEmpty(obj)||isEmpty(fieldName))return;ClasssuperClas......
  • 测试Java初学者建议
    作为测试工程师,我们需要具备扎实的编程技能,能够熟练掌握至少一门编程语言。因为测试工作本身就需要编写测试脚本、开发自动化测试工具和测试框架等,这些工作离不开编程语言的支持。同时,编程语言的不断更新和变化也要求我们不断学习和提升。选择一门适合自己的编程语言学习,可以帮助......