系列文章目录
第一章 如何保证多个线程的顺序执行?
第二章 如何排查线上环境内存使用过大?
文章目录
前言
Java面试过程中,对于项目线上遇到的问题会问一些,比如遇到哪些问题,怎么排查的,后期怎么修复的等等!我也整理了一些,请参考。
一、阿里 arthas(阿尔萨斯)
Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
可以参考arthas官网:https://arthas.aliyun.com/doc/
二、排查故障
1.构建模拟环境
我们可以构建一个简单的springboot项目,在项目中可以修改启动的JVM配置,导致问题比较容易出现;
代码如下(示例):
@RestController
@RequestMapping(value = "/memory")
public class MemoryController {
/**
* 创建一个强引用的全局变量
*/
List<byte[]> memoryList = new ArrayList<>();
@GetMapping("/oom")
public String oom(int n) {
/**
* 每次请求生成一个n M大小的空间
*/
byte[] b = new byte[n * 1024 * 1024];
memoryList.add(b);
return "success";
}
}
启动项目DemoApplication。
2.使用arthas查找问题
启动arthas时,如遇到找不到tools.jar,需配置JAVA_HOME。
可以看到堆的使用率,以及老年代的使用率都接近满的状态了,如果我们应用没有大的对象,那就是肯定某个对象站用了大量的空间。
使用arthas生成内存分区的火焰图:
profiler start --event alloc
profiler getSamples
profiler stop --format html
结果输出的html可以通过:http://localhost:3658/arthas-output/
从html中应该可以得到问题所在,是在com/example/demo/controller/MemoryController.oom方法,并且和byte[]有关,还和java.util.ArrayDeque有关,查看这个地方的代码,应该不难看出问题了。
3.使用hprof快照
按照项目启动时配置的快照路径/Users/***/Documents/logs
在Idea界面底部,找到profliler导入其中java_pid3373.hprof文件
总结
以上就是今天要讲的内容,本文仅仅简单介绍了arthas的使用,和hprof的分析。
额外
手写springboot+orm项目,有用的话还请star一下
https://github.com/AnswerYL/custom