一、Jconsole图像界面用法

1、找到jdk安装环境位置,进入Bin文件夹,打开jconsole.exe

 

 

 

 

二、Jconsole图像界面用法

 

1、用jconsole 检测死锁

/**
 * @ClassName Test1
 * @Description 死锁例子
 * @Author Dx
 * @Date 2020/10/19 17:07
 * @Version 1.0
 **/
public class Test1 {
    private static Object o1 = new Object();
    private static Object o2 = new Object();
    public static void main(String[] args) {
        for( int i = 0;i<100;i++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    synchronized (o1) {
                        synchronized (o2) {
                            System.out.println("am o1");
                        }
                    }
                }
            }).start();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    synchronized (o2) {
                        synchronized (o1) {
                            System.out.println("am o2");
                        }
                    }
                }
            }).start();
        }
    }
}

 

 

 

 

 

               

 

三、Cpu飙升产生的原因

1、Tomcat高并发项目的时候,所有线程都在运行状态,消耗CPU资源;

2、定时任务 (底层是死循环),定时任务跑批处理,定时任务与业务逻辑区分开来;

3、云服务redis 6379 外网部署,容易植入“挖矿程序”;

4、分布式锁(重试机制),当前节点如果没有抢到锁的时候(乐观锁),CAS自旋转;

四、Cpu飙升解决方案

1、对服务器接口实现限流、熔断、降级。

2、接口比较耗时的代码不要写成同步,改用MQ中间件。

3、定时任务项目一定和业务逻辑项目分开部署

a、降低业务逻辑项目cpu消耗资源

b、更好实现定时分片执行

c、在云服务器部署不要随意开放端口号 结合nginx 、lvs ,防止redis 被注入“挖矿程序”(redis C语言编写 部分有漏洞)

d、写自旋锁一定要控制循环。

 

五、如何排除Cpu飙升问题

1、windows服务器,任务管理查看那个进程占用cpu高;

2、Linux 使用Top命令查看进程;

六、如何排除Cpu飙升问题

 

 

 

 

 

1、找到jdk安装环境位置,进入Bin文件夹,打开jvisualvm.exe

 

 

 

 

 

 

 

 

2、选择抽样器,点击cpu

 

 

 

3、线程cpu (可以看到那个占用cpu最高)

 

 

 

七、使用jvisualvm监听生产环境虚拟机堆内存情况

  内存泄漏: 申请内存后,堆内存一直不释放;

 

  内存溢出: 申请内存前,内存不足;

 

Java进程与进程的通讯使用rmi技术