死锁排查,内存泄漏排查,cpu飙升,接口响应慢(查看执行时间),代码未生效(查看线上代码),方法执行异常(查看实时执行结果)

常见命令

 #按照进程名字查找
 ps -aux | grep java

#强制杀死进程
 kill -9 pid

#按照端口号进行查找
 netstat -anp |grep 8080

#查看两个机器是否联通
 telnet ip 端口

 #查看开放的端口
 cat /etc/ssh/sshd_config
#跨服务器拷贝
scp -r xxx.jar root@ssh ip:/usr             -》root指的是ip所在的登录用户
scp -P 22222 -r xxx.jar root@ssh ip:/usr    -》指定端口号默认22
scp -r xxx.jar root@ip:/usr                 -》省略写ssh

#无日志输出
 nohup java -jar xxx.jar > /dev/null 2> /dev/null &
#有日志输出
 nohup java -jar xxx.jar > ./output.log &
#指定配置文件输出
 nohup java -jar xxx.jar --spring.profiles.active=test2> ./output.log &
#查看日志
 tail -f ./output.log

#复杂搜索
grep
    定位
        grep '搜索内容' 路径开头*   ->比如grep 'aa' ./*xxx.log 或者xxx*或者xxx.log
        搜索内容复杂的可以用右边替换 \\[projectName\\][[:space:]]is System*   ->英文中括号加反斜杠,空格用[[:space:]]替换,搜索内容不要加引号
    前后
        grep -C 100 '搜索内容' xxx* 搜索前后100行
        grep -A 10 -B 1 '搜索内容' xxx* 搜索前一行后10行
tail
    tail -10f xxx.log   指定整个文件

1、死锁

 #性能排查
 https://blog.csdn.net/weixin_45549188/article/details/129629486
 #arthas教程
 https://arthas.aliyun.com/doc/quick-start.html


    /**
     //54-死锁
 */
    // 创建两个共享资源
    private static final String resource1 = new String();
    private static final Object resource2 = new Object();
    @GetMapping("lock")
    public void lock() {

        /**
         * 两个线程 thread1 thread2
         * thread1对resource1上锁,然后尝试获取resource2的锁;
         * thread2对resource2上锁,然后尝试获取resource1的锁;
         * 2个线程会相互等待,出现死锁
         */
        Thread thread1 = new Thread(() -> {
            synchronized (resource1) {
                System.out.println("Thread 1: Locked resource 1");

                try {
                    Thread.sleep(100); // 假设这里有其他操作,需要一些时间
                } catch (Exception e) {
                    e.printStackTrace();
                }

                System.out.println("Thread 1: Attempting to lock resource 2");

                //尝试索取resource2的锁
                synchronized (resource2) {
                    System.out.println("Thread 1: Locked resource 2");
                }
            }
        }, "thread1");

        Thread thread2 = new Thread(() -> {
            synchronized (resource2) {
                System.out.println("Thread 2: Locked resource 2");

                try {
                    Thread.sleep(100); // 假设这里有其他操作,需要一些时间
                } catch (Exception e) {
                    e.printStackTrace();
                }

                //尝试索取resource1的锁
                System.out.println("Thread 2: Attempting to lock resource 1");
                synchronized (resource1) {
                    System.out.println("Thread 2: Locked resource 1");
                }
            }
        }, "thread2");

        // 启动线程
        thread1.start();
        thread2.start();
    }
1-1、【推荐】排查步骤(命令)方法1
   ps -aux | grep java
     #杀死进程继续下一个测试
     kill -9 pid
     #以守护进程启动
     nohup java -jar cpu-oom-test-1.0-SNAPSHOT.jar > ./output.log &

     #如果出现这个工具没有的话
     -bash: pstack: command not found
     sudo yum install -y gdb
     
#直接输入面程序查看死锁
top
jstack pid
image.png
最后面就会出现发生死锁的位置了(默认敲完jstack命令就会滑到最后所以很容易就看到了)
image.png
1-2、使用arthas->方法2
 curl -O https://arthas.aliyun.com/arthas-boot.jar
     java -jar arthas-boot.jar
    #输入你的java程序,回车

#直接输入面程序查看死锁
    thread -b
image.png
image.png

2、内存泄漏

    

    /**
     //55-内存泄露
     */
    public static List<byte[]> oomList = new ArrayList<>();
    @GetMapping("oom")
    public String oom() {
        while (true) {
            //不断向列表中添加大对象, 10MB
            oomList.add(new byte[1024 * 1024 * 10]);
        }
    }

 //55-内存泄露
     ps -aux | grep java
     #杀死进程继续下一个测试
     kill -9 pid
     #以守护进程启动
     nohup java -jar cpu-oom-test-1.0-SNAPSHOT.jar > ./output.log &

     top
#可以查看内存占用情况
     jmap -heap pid

#使用arthas查看占用情况
dashboard
image.png
image.png
2-1【推荐】使用程序运行日志直接查看
这时候其实output.log里面也能看见是哪一行泄漏的
grep -A 10 -B 1 'OutOfMemory' output.log
image.png
2-2程序在运行之前就指定dump输出(特点文件小,信息精准)
运行直接指定(设置内存比较小方便测试)
     nohup java -jar -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./heap-dump.hprof -Xmx10m xxx.jar > ./output.log &

     #将上面的dump文件考出来

     #用visualvm工具进行分析,没有的进行下载
     https://visualvm.github.io/index.html

用工具加载之后,首页就有泄漏的红色标记
     或者summary换成thread 视图选择文本直接搜memory就可以看到了

image.png

image.png
2-3 在运行的时候手动导出堆信息(特点文件大,没有直接溢出信息)【不推荐】
     #在运行导出日志文件【直接导出的文件大,而且查不见泄漏的进程,日志可以】
     jmap -dump:format=b,file=./dump.hprof pid

    #将上面的dump文件考出来

https://eclipse.dev/mat/
  #必须使用Eclipse MAT工具进行分析才行
(工具下载不下来换镜像,jdk必须17以上)
#Spring推荐的Liberica Open JDK下载地址-贝尔实验室版本
https://bell-sw.com/pages/downloads/#jdk-8-lts
image.png
往下滑会提示有提示,只能大致推断出是那个类,不能具体到哪一行
 Thread Stack信息里面显示也是空空如也

image.png
image.png
如果结合visualvm分析的话,只能说也很难推断出是哪一行吧,不推荐
image.png
image.png

3、cpu飙升


    /**
     //56-cpu飙升
     //常规排查和arthas-57

     */

    @GetMapping("cpu")
    public void test1() {
        System.out.println("程序已启动");
        while (true) {
            ;
        }
    }
3-1常规方法(方法1)
 ps -aux | grep java
   #杀死进程继续下一个测试
     kill -9 pid
     #以守护进程启动
     nohup java -jar cpu-oom-test-1.0-SNAPSHOT.jar > ./output.log &

#使用top命令找到cpu飙升进程id
     top
     #根据进程id找到导致cpu飙升的线程
     ps H -eo pid,tid,%cpu | grep 进程id
     #将线程id转换为16进制
     printf '0x%x\n' 线程id
     #根据线程定位问题代码
     jstack 进程id | grep 16进制线程id -A 20


image.png

image.png

image.png

image.png

简化【推荐,省事】

创建一个脚本直接执行,把上面几个步骤合起来
#!/bin/bash
# 获取用户输入的进程 ID
read -p "请输入要分析的Java进程ID: " pid
# 查找该进程下CPU使用率最高的线程(按CPU使用率降序排序取第一条)
top_thread=$(ps H -eo pid,tid,%cpu | grep $pid | sort -k3 -nr | head -n 1 | awk '{print $2}')
# 将线程ID转换为十六进制
hex_thread=$(printf '0x%x\n' $top_thread)
# 使用jstack查找对应线程的栈信息并输出
jstack $pid | grep $hex_thread -A 20
image.png
3-2使用arthas(方法2)【推荐快】
  curl -O https://arthas.aliyun.com/arthas-boot.jar
     java -jar arthas-boot.jar
     #输入你的java程序,回车
thread
#找到占用最高cpu的线程id

thread 线程id
image.png

image.png

4、arthas排查接口响应慢,代码不生效,方法执行异常

    /**
     //58-60-接口响应慢-arthas
     */
    @GetMapping("slow")
    public void slow() throws InterruptedException {
        log.info("start");
        this.m1(100, "t1");
        this.m1(200, "t2");
        this.m1(1000, "t3");
        log.info("end");
    }

    private void m1(int minus, String name) throws InterruptedException {
        //休眠100毫秒
        TimeUnit.MILLISECONDS.sleep(minus);
        log.info(name);
    }
 ps -aux | grep java
     #杀死进程继续下一个测试
     kill -9 pid
     #以守护进程启动
     nohup java -jar cpu-oom-test-1.0-SNAPSHOT.jar > ./output.log &

     curl -O https://arthas.aliyun.com/arthas-boot.jar
     java -jar arthas-boot.jar
     #输入你的java程序,回车
4-1排查接口响应慢
  #接口响应慢排查
     【会显示总共执行时间是多少毫秒,每个步骤是多少毫秒】
     trace com.csw.cpuoom.controller.CpuOomController slow  -n 5 --skipJDKMethod false
     然后再掉一下接口观察输出
image.png

image.png
4-2、代码未生效
      #检查代码未生效
     【会反编译类获取线上的代码,能看到线上代码对不对】
     jad com.csw.cpuoom.controller.CpuOomControllerjadd
image.png
4-3方法执行异常(执行结果)
    /**
     62-查看方法执行异常-atthas
     */
    @GetMapping("err")
    public  void err() throws InterruptedException {
        System.out.println("程序已启动");
        for (int i = 1; i < 1000000; i++) {
            add(i, i + 1);
            TimeUnit.SECONDS.sleep(1);
        }
    }
    public static int add(int a, int b) {
        return a + b;
    }
#检查方法执行异常(执行结果)
     【相当于说能够看到方法的实时请求和返回值】【先敲命令后掉接口】
     watch com.csw.cpuoom.controller.CpuOomController add "{params,returnObj}" -x 2 -n 999
image.png

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容