美文网首页
内存溢出,查看哪些对象和类占用了cpu和内存

内存溢出,查看哪些对象和类占用了cpu和内存

作者: 君子愁 | 来源:发表于2020-01-08 23:15 被阅读0次

如何使用jstack分析线程状态

背景

记得前段时间,同事说他们测试环境的服务器cpu使用率一直处于100%,本地又没有什么接口调用,为什么会这样?cpu使用率居高不下,自然是有某些线程一直占用着cpu资源,那又如何查看占用cpu较高的线程?

当然一个正常的程序员不会写出上述代码,这里只是为了让一个线程占用较高的cpu资源。

top命令

在linux环境下,可以通过top命令查看各个进程的cpu使用情况,默认按cpu使用率排序

1、上图中可以看出pid为23344的java进程占用了较多的cpu资源;

2、通过top -Hp 23344可以查看该进程下各个线程的cpu使用情况;

上图中可以看出pid为25077的线程占了较多的cpu资源,利用jstack命令可以继续查看该线程当前的堆栈状态。

jstack命令

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

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。

实例2:通过wait挂起线程

dump结果

线程1和2都处于WAITING状态

1、线程1和2都是先locked <0x000000076bf62500>,再waiting on

<0x000000076bf62500>,之所以先锁再等同一个对象,是因为wait方法需要先通过synchronized获得该地址对象的monitor;

2、waiting

on <0x000000076bf62500>说明线程执行了wait方法之后,释放了monitor,进入到”Wait

Set”队列,等待其它线程执行地址为0x000000076bf62500对象的notify方法,并唤醒自己。

相关文章

  • 内存溢出,查看哪些对象和类占用了cpu和内存

    如何使用jstack分析线程状态 背景 记得前段时间,同事说他们测试环境的服务器cpu使用率一直处于100%,本地...

  • linux9~查看cpu和内存

    2017.04.21 实时查看内存变化 查看work用户的cpu和内存

  • 深入理解JVM总结

    1. 大概内容 内存区域 内存泄漏和内存溢出 类型擦除 对象创建,分配和访问 GC的判定 GC实现方法 类加载过程...

  • 内存泄漏和内存溢出是什么?一般怎么处理内存泄漏?

    1:内存溢出(OOM)和内存泄露(对象无法被回收)的区别。 (1)内存溢出:out of memory ,...

  • 记一次面试

    内存泄漏和内存溢出 概念 内存泄漏:垃圾回收器无法回收原本应该被回收的对象,这个对象就引发了内存泄露。 内存溢出:...

  • Java性能监控——Visual VM

    VisualVM,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈...

  • JVM 常见内容汇总

    面试题 对象 对象的创建 分配内存 对象头 内存溢出 内存溢出与内存泄漏 内存溢出:系统无法再分配内存空间。 内存...

  • 301-服务器运维命令

    查看进程,按内存从大到小 查看进程,按CPU利用率从大到小排序 查看php进程占用的内存 查看剩余内存 查看磁盘占...

  • 常用Linux命令

    看CPU和内存占用top查看某一个进程所有线程的CPU和内存占用top -Hp {PID}查看内存使用情况free...

  • 垃圾回收机制

    内存泄漏 概念:内存溢出指的是内存不够用了;内存泄漏是指对象可达,但是没用了。即本该被 GC 回收的对象并没有被回...

网友评论

      本文标题:内存溢出,查看哪些对象和类占用了cpu和内存

      本文链接:https://www.haomeiwen.com/subject/hfeeactx.html