Java死锁排查和Java CPU 100% 排查的步骤整理和OOM FullGc案例

工欲善其事,必先利其器简介本篇整理两个排查问题的简单技巧,一个是java死锁排查,这个一般在面试的时会问到,如果没有写多线程的话,实际中遇到的机会不多;第二个是java cpu 100%排查,这个实际的开发中,线的应用出现这个问题可能性比较大,所以这里简单总结介绍一下,对自己学习知识的一个整理,提高自己的解决问题能力。一、Java死锁排查通过标题我们就要思考三个问题…

大家好,又见面了,我是全栈君。

工欲善其事,必先利其器

此文进行了新的整理,整理后的文章请查看:一文学会Java死锁和CPU 100% 问题的排查技巧

简介

本篇整理两个排查问题的简单技巧,一个是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请自行查询资料】

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 < PID > 1 3 -u -t

这里写图片描述
这里写图片描述

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

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

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

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

巧转进制
6、 通过jstack -l < PID > 输出当前进程的线程信息

jstack -l pid /temp/test.log


线程的状态:
NEW,未启动的。不会出现在Dump中。
RUNNABLE,在虚拟机内执行的。
BLOCKED,受阻塞并等待监视器锁。
WATING,无限期等待另一个线程执行特定操作。
TIMED_WATING,有时限的等待另一个线程的特定操作。
TERMINATED,已退出的。

http://www.hollischuang.com/archives/110

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

查找

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

1、在进行压力测试的时候,使用jps找到应用的PID
2、然后使用jstack输出出压力测试时候应用的dump信息
3、分析输出的日志文件中那个方法block线程占用最多,这里可能是性能有问题,找到对应的代码分析

四、推荐一个脚本工具

show-busy-java-threads

详情看github中讲解!我自己下载了show-busy-java-threads!

安装和使用:

  1. 下载 show-busy-java-threads
  2. 上传服务器,然后进行解压
  3. 解压后
  4. 然后执行对应的命令
    这里写图片描述

扩展阅读

1、Java应用CPU占用100%原因分析
2、[Java] CPU 100% 原因查找解决
3、线上应用故障排查系列
4、分析JAVA应用CPU占用过高的问题
5. 一次应用 CPU 飙高的血案排查过程
6. 一次堆外OOM问题排查
7. 又是一个程序员粗心的代码引起频繁FullGC的案例
8.linux端口号与PID的互相查询


谢谢你的阅读,如果您觉得这篇博文对你有帮助,请点赞或者喜欢,让更多的人看到!祝你每天开心愉快!


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

博客首页 : https://aflyun.blog.csdn.net/

愿你我在人生的路上能都变成最好的自己,能够成为一个独挡一面的人
Java死锁排查和Java CPU 100% 排查的步骤整理和OOM FullGc案例

© 每天都在变得更好的阿飞云

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/121094.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • docker下Jenkins的部署和升级「建议收藏」

    docker下Jenkins的部署和升级「建议收藏」获取Jenkins镜像dockersearchjenkinsdockerpulljenkinsdockerimages创建映射目录mkdir-p/var/jenkins_homechown-R1000:1000/var/jenkins_home启动jenkins镜像sudodockerrun-itd-p8080:8080-p50000:50000–namejenkins–privileged=true-v/home/jenkins_

  • goland 2021.01 激活码[在线序列号]

    goland 2021.01 激活码[在线序列号],https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • 复变函数—–区域「建议收藏」

    复变函数—–区域「建议收藏」邻域、去心邻域平面上以Z0为中心,δ(任意的正数)为半径的圆:|Z-Z0|<δ内部的点的集合称为Z0的邻域,而称由不等式0<|Z-Z0|<δ所确定的点集为Z0的去心邻域。内点、开集设G为一平面点集,Z0为G中任意一点,如果存在Z0的一个邻域,该邻域内的所有点都属于G,那么称Z0为G的内点。如果G内的每个点都是它的内点,那么称G为开集。区域平面点集D称为一个区域,如果满足下列两个条件:1.D是一个开集;2.D是连通的,就是说D中任何两点都可以用完全属于D的一条折线连

  • 激光三角测距原理概述

    激光三角测距原理概述激光三角测距法作为低成本的激光雷达设计方案,可获得高精度、高性价比的应用效果,并成为室内服务机器人导航的首选方案,本文将对激光雷达核心组件进行介绍并重点阐述基于激光三角测距法的激光雷达原理。激光雷达四大核心组件激光雷达主要由激光器、接收器、信号处理单元和旋转机构这四大核心组件构成。激光器:激光器是激光雷达中的激光发射机构。在工作过程中,它会以脉冲的方式点亮。以思岚科技的RPLID…

  • ubuntu安装wget命令_macbook无法安装app

    ubuntu安装wget命令_macbook无法安装app有些时候,我们希望直接通过wget来下载文件。MacOS可以通过以下几种方式安装Wget:1、使用port命令sudoportinstallwget2、使用brew命令sudobrewinstallwget3、使用浏览器下载一个Wget的源码包,http://www.gnu.org/software/wget/打开终端解压,1)输入:tarzxvfwget-1.

    2022年10月16日
  • 以pptp方式登陆管理单口旁路由

    以pptp方式登陆管理单口旁路由由于入手了下载宝这个单口的千兆网口设备,一直想发挥一下它的余热,比如充当旁路由过滤广告什么的。但是修改脚本等功能必须以Lan口连接方式登录才能实现,这样的话,管理计算机网线不得不在主路由、下载宝之间来回插拔,非常的不方便。因为我的下载宝刷了Hiboy的老毛子固件,它提供了pptp访问方式,这样连接在主路由上的计算机即可通过连接在主路由上的下载宝WAN口ip登录,并实现lan口登录管理的所有功能。…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号