=================================================

人工智能教程。零基础!通俗易懂!风趣幽默!大家可以看看是否对自己有帮助!


点击查看高清无码教程

=================================================

工欲善其事,必先利其器

简介

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

一、Java死锁排查

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

  1. 什么是死锁?
  2. 为什么会出现死锁?
  3. 怎么排查代码中出现了死锁?

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

解答

  1. 什么是死锁?

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

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

  1. 为什么会出现死锁?

从上面的概念中我们知道

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

(2)必须有竞争资源

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

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

/**
*
* 使用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请自行查询资料】

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

使用jconsole

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

在windons命令窗口 ,输出 JConsole

使用Java Visual VM

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

在windons命令窗口 ,输出 jvisualvm

二、Java CPU 100% 排查

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

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

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



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线程占用最多,这里可能是性能有问题,找到对应的代码分析

参考

1、Java应用CPU占用100%原因分析

2、[Java] CPU 100% 原因查找解决

3、线上应用故障排查系列

4、分析JAVA应用CPU占用过高的问题


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

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


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

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

博客首页 : http://blog.csdn.net/u010648555

Java死锁排查和Java CPU 100% 排查的步骤整理的更多相关文章

  1. [转]Java CPU 100% 排查技巧

    文章来源:微信公众号:猿天地 平时多积累一点,这样在遇到问题的时候就少句求人的话.如果在实际的开发中遇到CPU 100%问题,要怎么排查呢?如果你没有遇到过这个问题,请先自己思考10s,如果你遇到过, ...

  2. java CPU 100% 排查(转载)

    一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环. (友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hank ...

  3. java CPU 100% 排查

    一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环. (友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hank ...

  4. 一次生产 CPU 100% 排查优化实践

    前言 到了年底果然都不太平,最近又收到了运维报警:表示有些服务器负载非常高,让我们定位问题. 还真是想什么来什么,前些天还故意把某些服务器的负载提高(没错,老板让我写个 BUG!),不过还好是不同的环 ...

  5. 阿里短信回持.net sdk的bug导致生产服务cpu 100%排查

    一:背景 1. 讲故事 去年阿里聚石塔上的所有isv短信通道全部对接阿里通信,我们就做了对接改造,使用阿里提供的.net sdk. 网址:https://help.aliyun.com/documen ...

  6. 一文学会Java死锁和CPU 100% 问题的排查技巧

    做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开 工欲善其事,必先利其器 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在 ...

  7. 【性能优化】一文学会Java死锁和CPU100%问题的排查技巧

    原文链接: 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在实际的工作或者面试就有遇到过: 第一个问题:Java死锁如何排查和解决? 第二个问题:服 ...

  8. Linux(2)---记录一次线上服务 CPU 100%的排查过程

    Linux(2)---记录一次线上服务 CPU 100%的排查过程 当时产生CPU飙升接近100%的原因是因为项目中的websocket时时断开又重连导致CPU飙升接近100% .如何排查的呢 是通过 ...

  9. JAVA程序CPU 100%问题排查

    做JAVA开发的同学一定遇到过的爆表问题,看这里解决  https://www.cnblogs.com/qcloud1001/p/9773947.html   本文由净地发表于云+社区专栏 记一次Ja ...

随机推荐

  1. python XML梳理

    导入ElementTree模块 import xml.etree.ElementTree as ET 为了创建一个element实例,使用Element 构造函数或者SubElement()工厂函数. ...

  2. Swift学习笔记1

    1.Swift 的String类型是值类型. 如果您创建了一个新的字符串,那么当其进行常量.变量赋值操作,或在函数/方法中传递时,会进行值拷贝. 任何情况下,都会对已有字符串值创建新副本,并对该新副本 ...

  3. linux服务器安装mysql并配置外网访问

    linux服务器安装mysql并配置外网访问 更新系统,如果不运行该命令,直接安装mysql,会出现"有几个软件包无法下载 sudo apt-get update 安装mysql sudo ...

  4. Linux(Debian)软件安装

    # 配置/etc/apt/sources.list 通过root权限修改/etc/apt/sources.list $ su #输入密码进入root权限 $ chmod 0666 /etc/apt/s ...

  5. mysql先排序在分组

    – 表的结构 `test`– CREATE TABLE IF NOT EXISTS `test` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varcha ...

  6. swift3.0之后的Error处理

    在之前的版本中,Swift中Error与OC中NSError没有关系.但是现在两者可以互相强转. 我们看看两者的区别:Error是一个实现Error协议的枚举或者结构体,对外能够获取的具体信息只有ra ...

  7. Linux - awk 文本处理工具四

    awk 常用示例 获取本机 IP 方式 /sbin/ifconfig |awk -v RS="Bcast:" '{print $NF}'|awk -F: '/addr/{print ...

  8. HTML5 CSS Reset

    最近在学习HTML和CSS,发现一个不错的模板,放于此处. /* html5doctor.com Reset Stylesheet v1.6.1 Last Updated: 2010-09-17 Au ...

  9. RTS与CTS的含义【转】

    转自:http://www.cnblogs.com/sunyubo/archive/2010/04/21/2282176.html 一.RS232标准中的RTS与CTS RTS,CTS------请求 ...

  10. 查看nginx | apache | php | tengine | tomcat版本的信息以及如何隐藏版本信息【转】

    转自: 查看nginx | apache | php | tengine | tomcat版本的信息以及如何隐藏版本信息 - 追马 - 51CTO技术博客http://lovelace.blog.51 ...