昔年浅巷

昔年浅巷

11月项目开发问题总结

41
2024-12-03

线程死锁排查

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/dead")
public class DeadLockController {

    private static final Object a = new Object();
    private static final Object b = new Object();

    @GetMapping("/lock")
    public void lock() {

        Thread t1 = new Thread(() -> {
            synchronized (a) {
                System.out.println("a被锁住了!!!");
                try {
                    Thread.sleep(200);
                    synchronized (b) {
                        System.out.println("b被锁住了!!!");
                    }

                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });

        Thread t2 = new Thread(() -> {
            synchronized (b) {
                System.out.println("b被锁住了!!!!");
                try {
                    Thread.sleep(200);
                    synchronized (a) {
                        System.out.println("a被锁住了!!!");
                    }
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }

            }
        });
        t1.start();
        t2.start();
    }
}

使用idea自带的分析器插件

1732525233265.png

使用arthas的 thread 命令排查

https://arthas.aliyun.com/doc/thread.html

1732525390535.png

JVM的调优

常见调优

1732525678245.png

jps 查看JAVA进程

1733214435656.png

JInfo 查看JVM参数

1733214559640.png

Jstat -gc 查看java进程内存分配

1733214610812.png

说明:

S0C: 年轻代中第一个survivor(幸存区)的容量(字节)
S1C: 年轻代中第二个survivor(幸存区)的容量(字节)
S0U: 年轻代中第一个survivor(幸存区)目前已使用空间(字节)
S1U: 年轻代中第二个survivor(幸存区)目前已使用空间(字节)
EC: 年轻代中Eden(伊甸园)的容量(字节)
EU: 年轻代中Eden(伊甸园)目前已使用空间(字节)
OC: Old代的容量(字节)
OU: Od代目前已使用空间(字节)
MC: metaspace(元空间)的容量(字节)
MU: metaspace(元空间)目前己使用空间(字节)
YGC:从应用程序启动到采样时年轻代中gC次数
YGCT: 从应用程序启动到采样时年轻代中gC所用时间(S)
FGC:从应用程序启动到采样时old代(全gc) gc次数
FGCT:从应用程序启动到采样时old代(全gc) gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)