Java内存溢出OOM之dump分析

目录

内存泄露

内存溢出

1.Java堆内存异常

报错方式

原因

2.Java栈内存异常

报错方式

原因

3.方法区内存异常

报错方式

原因

解决思路

生成dump文件三种方式

dump生成

jvisualvm本地方式

1.启动jvisualvm

2.应用程序启动

3.从jvisualvm控制台,进入监控应用程序面板

4.模拟OOM

线上模式

1.查找到进程相关:top -c

2.查看堆gc每秒相关信息

3.查找栈相当问题

4.有必要时,使用命令生成jmap文件

5.下载dump文件,使用MAT工具/jhat分析。

其它辅助命令

dump分析

MAT工具分析dump文件

1.安装

2.加载dump文件

3.加载完成

4.分析结果

jhat命令分析dump文件

1.启动jhat

2.访问分析


内存泄露

代码中的某个对象本应该被虚拟机回收,因为GCRoot引用而没有被回收。

内存溢出

虚拟机由于堆中拥有太多不可回收对象没有回收,导致无法继续创建新对象。

有如下三种异常:

1.Java堆内存异常

报错方式

java.lang.OutOfMemoryError: Java heap space

原因

异常导致-Xms或-Xmx配置不足

  • 使用了大量的递归或无限递归对象
  • 使用了大量循环或死循环(循环中用到了大量的新建的对象)
  • 使用了向数据库查询过多,可能会造成内存溢出。
  • 有数组,List,Map中存放的是对象的引用而不是对象,这些引用会让对应的对象不能被释放。会大量存储在内存中。

2.Java栈内存异常

报错方式

Exception in thread "main" java.lang.StackOverflowError

原因

对象过大或过多异常,导致-Xss配置的内存不足

  • 是否有递归调用
  • 是否有大量循环或死循环
  • 全局变量是否过多
  • 数组、List、map数据是否过大

3.方法区内存异常

报错方式

Exception in thread "main" java.lang.OutOfMemoryError: Metaspace

原因

异常导致-XX:MetaspaceSize或-XX:MaxMetaspaceSize配置不足

解决思路

1、当不通过日志文件主观来判断出问题代码时,通过分析dump文件来分析

2、Arthas工具分析-见下篇分析

生成dump文件三种方式

1.jvisualvm控制台,监控时主动生成dump文件

2.使用jmap命令生成dump文件

  • windows环境:jmap -dump:live,format=b,file=heap.hprof <pid>
  • linux环境:./jmap -dump:live,format=b,file=heap.hprof <pid>

3.在应用启动时配置添加 -XX:+HeapDumpOnOutOfMemoryError 参数,

当应用抛出OutOfMemoryError 时自动生成dump文件;目录指定:XX:HeapDumpPath

[zoms@ocs ~]$ jmap -dump:live,format=b,file=heap-vm.hprof 15463
Dumping heap to /home/zoms/heap-vm.hprof ...
Heap dump file created

dump生成

jvisualvm本地方式

1.启动jvisualvm

在jdk1.8安装目录下,${JDK_HOME}\bin\jvisualvm.exe,双击启动Java VisualVM控制台

image.png

2.应用程序启动

模拟OOM代码

/**
 * @Description
 * @Auther: huhua
 * @Date: 2021/3/4
 */
@Slf4j
public class TestDump {
    public static void main(String[] args) throws Exception {
        Integer size = 1024 * 1024 * 8 ;
        List<byte[]> list = new ArrayList<byte[]>();
        for(int a=1; a<1000; a++){
            Thread.sleep(1000);
            list.add(new byte[size]);
            log.info("JMV测试:list写入{}M", a*8);
        }

    }
}

3.从jvisualvm控制台,进入监控应用程序面板

可查看到本地运行java应用,选择应用进入

  • 概述

image.png

  • 实时监视

image.png

4.模拟OOM

image.png

  • 点击“堆Dump”或在应用上右击选择生成快照文件。

image.png

  • 可用MAT工具去分析dump文件

线上模式

1.查找到进程相关:top -c

也可jps 或ps -ef|grep java 或 ll /proc/<pid> 找到相关java进程

2.查看堆gc每秒相关信息

调优YGC的次数非常少,FGC更少:jstat -gc <pid> 1000(每隔ms数)

3.查找栈相当问题

使用命令 jstack -l 1346 查看线程栈信息,锁问题

4.有必要时,使用命令生成jmap文件

jmap -dump:live,format=b,file=/xx/xxx/xxx.hprof <pid>

ps:该命令对正在运行应用会产生影响,要谨慎使用,生产环境考虑arthas,具体可参见arthas分析。

5.下载dump文件,使用MAT工具/jhat分析。

其它辅助命令

  • 查看gc回收统计情况:jstat -gc pid 1000(每隔ms数) 5(输出次数)
  • 查看内存使用情况:jmap -heap pid
  • 查看内存中对象数据:jmap -histo:live <pid> | more

dump分析

MAT工具分析dump文件

1.安装

下载:http://www.eclipse.org/mat/downloads.php

解压后,点击MemoryAnalyzer.exe启动

image.png

2.加载dump文件

image.png

3.加载完成

image.png

4.分析结果

从图看有三个problem,依次往下查看各个problem

image.png

 

点击Details查看problem具体描述

image.png

点击如下图标可切换到Class Name视图

image.png

jhat命令分析dump文件

1.启动jhat

#用法:
jhat -port <port> <file>

#示例:

[zoms@ocs ~]$ jhat -port 8035 heap-vm.hprof
Reading from heap-vm.hprof...
Dump file created Fri Mar 05 15:30:57 CST 2021
Snapshot read, resolving...
Resolving 239638 objects...
Chasing references, expect 47 dots...............................................
Eliminating duplicate references...............................................
Snapshot resolved.
Started HTTP server on port 8035
Server is ready.

2.访问分析

  1. 通过http://ip:port来访问分析控制台,可以查询到所有的目录下类及对象

image.png

  1. 在页面最下方也提供其它方式查询

image.png

  • 展示堆快照直方图:Show heap histogram

image.png

通过对象,可查询到对象的异常,如大小异常

image.png

  • 使用OQL查询:Execute Object Query Language (OQL) query

可使用特殊语法查询。可以在OQL help处模仿编写

image.png

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值