admin管理员组文章数量:1794759
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中存放的是对象的引用而不是对象,这些引用会让对应的对象不能被释放。会大量存储在内存中。
Exception in thread "main" java.lang.StackOverflowError
原因对象过大或过多异常,导致-Xss配置的内存不足
- 是否有递归调用
- 是否有大量循环或死循环
- 全局变量是否过多
- 数组、List、map数据是否过大
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控制台
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应用,选择应用进入
- 概述
- 实时监视
- 点击“堆Dump”或在应用上右击选择生成快照文件。
- 可用MAT工具去分析dump文件
也可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
下载:www.eclipse/mat/downloads.php
解压后,点击MemoryAnalyzer.exe启动
2.加载dump文件 3.加载完成 4.分析结果从图看有三个problem,依次往下查看各个problem
点击Details查看problem具体描述
点击如下图标可切换到Class Name视图
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.访问分析- 展示堆快照直方图:Show heap histogram
通过对象,可查询到对象的异常,如大小异常
- 使用OQL查询:Execute Object Query Language (OQL) query
可使用特殊语法查询。可以在OQL help处模仿编写
版权声明:本文标题:Java内存溢出OOM之dump分析 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686917199a118036.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论