JVM---jstack分析Java线程CPU占用,线程死锁的解决

 更新时间:2020年09月17日 08:59:13   作者:Mistra丶  
这篇文章主要介绍了JVM---jstack分析Java线程CPU占用,线程死锁的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

本文章主要演示在Windows环境,Linux环境也差不多。

一、分析CPU占用飙高

首先写一个Java程序,并模拟一个死循环。让CPU使用率飙高。CPU负载过大的话,新的请求就处理不了了,这就是很多程序变慢了甚至不能访问的原因之一。

下面是我这里的Controller,启动程序之后,开多个请求访问这个方法。死循环代码就不贴了,自己构造。我这里模拟的一个截取字符串的死循环。

/**
 * 演示死循环导致cpu使用率飙高
 * */
 @RequestMapping("/loop")
 public List<Long> loop(){
 return getPartneridsFromJson();
 }

启动程序,查看线程id,我这里是 796

开多个请求访问Controller方法,可以在任务管理器看到CPU不断增高。我开了7个窗口请求。Linux下可以通过 top命令查看CPU占用率。

现在发生了问题,开始定位问题。问题是我们手动构造的,实际生产环境肯定比这个复杂的多。

先把Java线程信息输出到指定文件,我这里就输出到桌面的cpu.txt文件中,如下

某线程部分属性说明:

jstack 796 > cpu.txt

Windows下要借助一个工具,查看系统进程以及线程的详细信息:

ProcessExplorer :下载地址:ProcessExplorer

解压,启动,长这样

熟悉的身影,PID为796的Java进程。CPU占用率最高。

在java.exe上右键选择Properties,在弹出的窗口选择Thread信息

可以看到7个CPU占用异常高的线程。这里的TID就是线程ID,不过是10进制的。刚刚我们jstack导出来的cpu.txt文件中的线程id是16进制的。

Linux下可以通过命令:

top -p 796 -H

查看线程的CPU占用率。

随便看一个,13812转换成16进制为:35f4,我们在cpu.txt搜一下这个线程

**可以发现,这个线程是运行中的状态,在执行indexOf方法。是JVMTuningController.getPartneridsFromJson这个方法。**这样就能定位到发生问题的位置了。实际生产情况要比这个复杂的多。就要慢慢分析了

二、分析线程死锁

先构造一个死锁方法,网上一搜一大把,我就不贴了。这是我的controller代码

/**
* 演示死锁 导致cpu使用率飙高
* */
@RequestMapping("/deadlock")
public String deadlock(){
 deadLock();
}

程序跑起来,然后请求这个方法。

输出线程信息到deadLock.txt

jstack 15808 > deadLock.txt

打开deadLock.txt,看到最后面

以上这篇JVM---jstack分析Java线程CPU占用,线程死锁的解决就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • springboot解决前后端分离时的跨域问题

    springboot解决前后端分离时的跨域问题

    这篇文章主要介绍了springboot如何解决前后端分离时的跨域问题,帮助大家更好的理解和学习使用springboot,感兴趣的朋友可以了解下
    2021-04-04
  • 几道常问Redis面试题,你能答对吗?

    几道常问Redis面试题,你能答对吗?

    在程序员面试过程中redis相关的知识是常被问到的话题。这篇文章主要介绍了13道Redis面试题,整理一下分享给大家,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • springboot项目突然启动缓慢的解决

    springboot项目突然启动缓慢的解决

    这篇文章主要介绍了springboot项目突然启动缓慢的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • java实现基于SMTP发送邮件的方法

    java实现基于SMTP发送邮件的方法

    这篇文章主要介绍了java实现基于SMTP发送邮件的方法,实例分析了java基于SMTP服务发送邮件的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • Java生成中间logo的二维码的示例代码

    Java生成中间logo的二维码的示例代码

    这篇文章主要介绍了Java如何生成中间logo的二维码,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Java定义泛型方法实例分析

    Java定义泛型方法实例分析

    这篇文章主要介绍了Java定义泛型方法,结合实例形式分析了java定义泛型的相关操作技巧与注意事项,需要的朋友可以参考下
    2019-07-07
  • spring boot 使用@Async实现异步调用方法

    spring boot 使用@Async实现异步调用方法

    本篇文章主要介绍了spring boot 使用@Async实现异步调用方法,具有一定的参考价值,有兴趣的可以了解一下。
    2017-04-04
  • Java函数式编程之通过行为参数化传递代码

    Java函数式编程之通过行为参数化传递代码

    行为参数化就是可以帮助你处理频繁变更的需求的一种软件开发模式,这篇文章将给大家详细的介绍一下Java函数式编程之行为参数化传递代码,感兴趣的同学可以参考阅读下
    2023-08-08
  • Mybatis Plus代码生成器(时间管理大师)

    Mybatis Plus代码生成器(时间管理大师)

    这篇文章主要介绍了Mybatis Plus代码生成器(时间管理大师)的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Java中死锁与活锁的具体实现

    Java中死锁与活锁的具体实现

    锁发生在不同的请求中,本文主要介绍了Java中死锁与活锁,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05

最新评论