首页 技术 正文
技术 2022年11月6日
0 收藏 831 点赞 840 浏览 2081 个字

一、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方法,得到这个信息,就可以检查对应的代码是否有问题。

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

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

很明显:线程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

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

第一列。内存块起始地址

第二列。占用内存大小

第三列,内存权限

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

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

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

命令格式:

jmap -histo 进程id

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

第一列,序号。

第二列,对象实例数量

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

第四列,对象实例名称

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

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

通常运行命令如下:

jstat -gc 15712 5000

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

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

– 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).

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,492
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,907
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,740
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,494
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,132
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,295