吉林电商网站建设,网络销售的方法和技巧,云南网络公司哪家好,私人建设手机网站文章目录 前言一、内存使用过高导致CPU满载案例代码分析思路 二、出现了类似死循环导致cpu负载案例代码分析思路 三、死锁案例代码分析思路 前言
首先线上接口变慢#xff0c;原因可能有很多#xff0c;有可能是网络#xff0c;有可能是慢 SQL#xff0c;有可能是服务本身… 文章目录 前言一、内存使用过高导致CPU满载案例代码分析思路 二、出现了类似死循环导致cpu负载案例代码分析思路 三、死锁案例代码分析思路 前言
首先线上接口变慢原因可能有很多有可能是网络有可能是慢 SQL有可能是服务本身出现了问题还有可能是机器达到了性能瓶颈。而机器性能瓶颈也又可以分为磁盘 IO 瓶颈、CPU 性能瓶颈、网卡瓶颈等等。
线上接口过慢排除网络的原因之外无非有以下三点
内存使用过高频繁gc导致cpu占满内存使用不高出现了类似死循环场景死锁 一般在遇到问题的时候先使用top -c 命令查看cpu是否占满然后再使用free -m查看内存使用率初步 判断是上面问题的哪一种然后再针对这一种问题深入排查。下面来模拟一下以上几种情况
一、内存使用过高导致CPU满载
案例代码
public class FullGc {public static void main(String[] args) {ListObject list new ArrayList();for (int i 0; i 10000000; i) {String str ;for (int j 0; j 1000; j) {str UUID.randomUUID().toString();}list.add(str);System.out.println(str);}}}
分析思路 查看负载高的cpu进程id top -c 这时发现进程id为70719的cpu负载较高 查看该进程id的线程id top -Hp 70719 这时发现线程id为70720的线程负载较高 将十进制的线程id转换为16进制小写的printf “%x\n” 69476 发现16进制的线程id为11440 查看该线程的运行的情况jstack 70719|grep 11440 -A60 发现是FullGc这个类的第14行有问题 通过jamp工具导出内存日志分析堆的情况jmap -dump:formatb,filedump.dat 70719 使用MAT工具分析堆的情况
发现了以上大量的字符串
二、出现了类似死循环导致cpu负载
案例代码
public class Cpu {public static void main(String[] args) {while (true) {}}
}分析思路
基本上跟内存使用率过高的前几步差不多的依然是以下几步
top命令查看当前CPU消耗过高的进程得到进程id根据进程id得到占比较高的线程id将线程id转换为十六进制根据进程编号用jstack命令查看线程id可以得到线程的具体堆栈信息
从图中可以看出Cpu这个类的第三行有问题
三、死锁
案例代码
public class DeadLock {private static Object left new Object();private static Object right new Object();private static class Thread1 implements Runnable {Overridepublic void run() {synchronized (left) {try {Thread.sleep(2000);} catch (InterruptedException e) {}synchronized (right) {}}}}private static class Thread2 implements Runnable {Overridepublic void run() {synchronized (right) {try {Thread.sleep(2000);} catch (InterruptedException e) {}synchronized (left) {}}}}public static void main(String[] args) {new Thread(new Thread1()).start();new Thread(new Thread2()).start();}
}分析思路
这个就简单了
先使用jps查看进程id如图 找出死锁的线程jstack [进程id] jvm会自动搜索出死锁的堆栈信息