工欲善其事,必先利其器

简介

本篇整理两个排查问题的简单技巧,一个是java死锁排查,这个一般在面试的时会问到,如果没有写多线程的话,实际中遇到的机会不多;第二个是java cpu 100%排查,这个实际的开发中,线的应用出现这个问题可能性比较大,所以这里简单总结介绍一下,对自己学习知识的一个整理,提高自己的解决问题能力。

一、Java死锁排查

通过标题我们就要思考三个问题:

什么是死锁?

为什么会出现死锁?

怎么排查代码中出现了死锁?

作为技术人员(工程师),在面对问题的时候,可能需要的能力是怎么去解决这个问题。但是在学习技术知识的时候,那就要多问为什么,一定要锻炼自己这方面的能力,这样才能更好的掌握知识。

解答:

什么是死锁?

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。百度百科:死锁

死锁图示

注:进程和线程都可以发生死锁,只要满足死锁的条件!

为什么会出现死锁?

从上面的概念中我们知道

(1)必须是两个或者两个以上进程(线程)

(2)必须有竞争资源

怎么排查代码中出现了死锁?【重点来了】

首先写一个死锁的代码,看例子:

/**

*

* 使用jstack 排查死锁

* @author dufyun

*

*/

public class JStackDemo {

public static void main(String[] args) {

Thread t1 = new Thread(new DeadLockTest(true));//建立一个线程

Thread t2 = new Thread(new DeadLockTest(false));//建立另一个线程

t1.setName("thread-dufy-1");

t2.setName("thread-dufy-2");

t1.start();//启动一个线程

t2.start();//启动另一个线程

}

}

class DeadLockTest implements Runnable {

public boolean falg;// 控制线程

DeadLockTest(boolean falg) {

this.falg = falg;

}

public void run() {

/**

* 如果falg的值为true则调用t1线程

*/

if (falg) {

while (true) {

synchronized (Demo.o1) {

System.out.println("o1 " + Thread.currentThread().getName());

synchronized (Demo.o2) {

System.out.println("o2 " + Thread.currentThread().getName());

}

}

}

}

/**

* 如果falg的值为false则调用t2线程

*/

else {

while (true) {

synchronized (Demo.o2) {

System.out.println("o2 " + Thread.currentThread().getName());

synchronized (Demo.o1) {

System.out.println("o1 " + Thread.currentThread().getName());

}

}

}

}

}

}

class Demo {

static Object o1 = new Object();

static Object o2 = new Object();

}

上面这段代码执行后,就会出现死锁,那么排查的方法有如下:

使用 jps + jstack

第一:在windons命令窗口,使用 jps -l 【不会使用jps请自行查询资料】

jps -l 命令

第二:使用jstack -l 12316 【不会使用jstack请自行查询资料】

jstack

使用jconsole

在window打开 JConsole,JConsole是一个图形化的监控工具!

在windons命令窗口 ,输出 JConsole

这里写图片描述

这里写图片描述

使用Java Visual VM

在window打开 jvisualvm,jvisualvm是一个图形化的监控工具!

在windons命令窗口 ,输出 jvisualvm

Java Visual VM

死锁检测

二、Java CPU 100% 排查

这个如果在实际的应用开发中遇到,要怎么排查呢?

这里没有一步步的图示过程,只有一个简单的操作过程!有空写一个详细的例子。

1 、 使用top命令查看cpu占用资源较高的PID

top命令

2、 通过jps 找到当前用户下的java程序PID

执行 jps -l 能够打印出所有的应用的PID,找到有一个PID和这个cpu使用100%一样的ID!!就知道是哪一个服务了。

3、 使用 pidstat -p 1 3 -u -t

这里写图片描述

4 、 找到cpu占用较高的线程TID

通过上图发现是 3467的TID占用cup较大

5、 将TID转换为十六进制的表示方式

将3467转为十六进制 d8d,注意是小写!

巧转进制

6、 通过jstack -l 输出当前进程的线程信息

使用jstack 输出当前PID的线程dunp信息

7、 查找 TID对应的线程(输出的线程id为十六进制),找到对应的代码

查找

三、压力测试使用jstack找到系统的代码性能问题

1、在进行压力测试的时候,使用jps找到应用的PID

2、然后使用jstack输出出压力测试时候应用的dump信息

3、分析输出的日志文件中那个方法block线程占用最多,这里可能是性能有问题,找到对应的代码分析

参考

如果您觉得这篇博文对你有帮助,请点赞或者喜欢,让更多的人看到,谢谢!

如果帅气(美丽)、睿智(聪颖),和我一样简单善良的你看到本篇博文中存在问题,请指出,我虚心接受你让我成长的批评,谢谢阅读!

祝你今天开心愉快!

欢迎访问我的csdn博客,我们一同成长!

不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!

java线程死锁 cpu 100%_Java死锁排查和Java CPU 100% 排查的步骤整理相关推荐

  1. java 线程什么时候结束_java线程什么时候让出cpu?

    Thread.sleep(); sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过后,cpu才会回到这个线程上继续往下执行,如果当前线程进入了同步锁,sleep ...

  2. java线程堆栈nid.tid_java多线程死锁 Java问题定位之Java线程堆栈分析(2)

    从上面的main线程看,线程堆栈里面的最直观的信息是当前线程的调用上下文,即从哪个函数调用到哪个函数(从下往上看),正执行到哪一类的哪一行,借助这些信息,我们就对当前系统正在做什么一目了然. 另外,从 ...

  3. java线程挂起唤醒_java线程技术6_线程的挂起和唤醒[转]

    转自:http://blog.chinaunix.net/uid-122937-id-215913.html 1. 线程的挂起和唤醒 挂起实际上是让线程进入"非可执行"状态下,在这 ...

  4. java 线程的基本概念_Java多线程——基本概念

    线程和多线程 程序:是一段静态的代码,是应用软件执行的蓝本 进程:是程序的一次动态执行过程,它对应了从代码加载.执行至执行完毕的一个完整过程,这个过程也是进程本身从产生.发展至消亡的过程 线程:是比进 ...

  5. java线程占用CPU_在windows下揪出java程序占用cpu很高的线程并完美解决

    我的一个java程序偶尔会出现cpu占用很高的情况 一直不知道什么原因 今天终于抽时间解决了 系统是win2003 jvisualvm 和 jconsole貌似都只能看到总共占用的cpu 看不到每个线 ...

  6. java线程池存在时间_Java线程池基础

    目录: 一.线程池概述 1.线程池类 目前线程池类一般有两个,一个来自于Spring,一个来自于JDK: 来自Spring的线程池:org.springframework.scheduling.con ...

  7. linux杀java线程,如何在Linux下找出大量占用CPU的java线程

    首先获取jvm的进程pid. [biee02@bjkjy-bi-devbiee01 ~]$ jps -v 26048 Server -Xms256m -Xmx2048m -Dweblogic.Name ...

  8. java 线程的基本概念_Java多线程——多线程的基本概念和使用

    一.进程和线程的基础知识 1.进程和线程的概念 进程:运行中的应用程序称为进程,拥有系统资源(cpu.内存) 线程:进程中的一段代码,一个进程中可以有多段代码.本身不拥有资源(共享所在进程的资源) 在 ...

  9. java线程池怎么创建_java中的线程池,如何创建?

    Java中的线程池它是线程的容器,或者(换句话说,它是具有执行任务能力的线程的集合). 我们可以使用ThreadPool框架来定位(或实现)线程池. 线程池可以包含多个线程.每当我们执行任何任务时,线 ...

最新文章

  1. 图片指定区域根据rgb值计算出对应的坐标地址_【水文】震惊!高考期间,这位学生居然能通过图片隐写实现文字通信!...
  2. tableau必知必会之学做常用的倾斜图(slopegraph)
  3. python向数据库传输数据时弹出not enough arguments for format string怎么办
  4. 从0到1写RT-Thread内核——临界段的保护
  5. 6-3 断言与防御式编程
  6. 通信行业最齐全的英语缩语手册
  7. yuzu 使用指南:如何在 PC 上运行 Switch 游戏
  8. 注入工具使用-sqlmap
  9. 用python计算化学题_(完整版)化学计算题解题方法(含答案)
  10. 请领导过目文件怎么说_职场话题:当领导说“你定吧”,你会怎么做?
  11. 量化投资之工具篇一:Backtrader从入门到精通(5)-Strategy类源代码解读
  12. 他把科学,放进几代人的中二梦
  13. 云上PDF怎么删除页眉页脚_PDF怎么删除页面?
  14. 在类方法中可 用this来调用本类的类方法
  15. 列出每一个部门中年纪最大的员工姓名,部门名称【多测师_王sir】
  16. 自适应滤波器设计及matlab实现,自适应滤波器设计及Matlab实现附程序代码
  17. 央视看上绿色P2P网站
  18. monkey命令_随机测试工具猴子monkey
  19. 5G+AI将会为客服行业带来哪些深度影响?
  20. Halcon不使用标定板如何矫正畸变?

热门文章

  1. 抓包西瓜视频百万英雄实践
  2. 消息队列之延迟队列超详细入门教程速看
  3. navicat mysql 触发器_Navicat使用教程:使用MySQL 8中的触发器验证数据
  4. oracle oaf结构,OAF文档四:分析OAF页面(二)
  5. 高校非计算机专业学生计算机基础,浅析高校非计算机专业计算机基础教学改革...
  6. 红包封面来了 | 虎年有AI
  7. HTC vive pro unity开发者软件/SDK版本注意事项
  8. 计算机窗口闪屏,热点:电脑显示器闪屏(电脑屏幕闪烁的解决方法)
  9. Sybase数据库助力中国铁路售票系统案例
  10. 支持linux系统摄像头模块,Linux系统上如何安装摄像头?