排查线上环境内存使用过大

系列文章目录

第一章 如何保证多个线程的顺序执行?

第二章 如何排查线上环境内存使用过大?



前言

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

新手学堂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值