jvm内存溢出问题排查演示

实验环境:cenos7

实验代码

不停的new对象加入list中

//list放到类成员变量
    // 如果放到方法里面,方法结束后会,当内存不够,会触发gc,且list可被回收,不会造成内存泄露问题。
    List<User> userlist = new ArrayList<>();
    public void getUserList() {
        while(true){
            userlist.add(new User());
        }
    }

实验步骤

在controller中调用实验代码

/**
     * 堆内存溢出
     * @return
     */
    @RequestMapping("/getUserList")
    @ResponseBody
    public String getUserList() {
        deadLockService.getUserList();
        return "getUserList";
    }

部署项目到linux环境并启动简单演示

java -Xmx32M -Xms32M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./ -jar order-0.0.1-SNAPSHOT.jar &

排查演示

调用接口:发现内存飙高,且日志打印出了内存溢出错误

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA3NzIyMzA=,size_16,color_FFFFFF,t_70

20200206152649602.png

可以看到,发生内存溢出时候,生成的文件

20200206152749378.png

当然,也可以使用命令来导出内存溢出的快照文件,命令如下

先查对应的pid,5295为对应的pid
jps -l
jmap -dump:format=b,file=5295.hprof 5295

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA3NzIyMzA=,size_16,color_FFFFFF,t_70

将文件导出来,文件一般比较大

sz 5295.hprof

 

借助内存分析工具MAT排查内存溢出问题。

MAT下载地址

https://eclipse.org/mat/downloads.php 

 

发现了一个非常大的对象

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA3NzIyMzA=,size_16,color_FFFFFF,t_70

 

继续打开报告看一下,发现了我们事先模拟的内存溢出对象位置,导致排查完毕。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA3NzIyMzA=,size_16,color_FFFFFF,t_70

也可以打开dominator_tree查看

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA3NzIyMzA=,size_16,color_FFFFFF,t_70

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值