Java内存溢出OOM使用Mat分析
示例
package com.rumenz;
import java.util.ArrayList;
import java.util.List;
public class OutOfMemory {
public static void main(String[] args) {
List<UserTest> res=new ArrayList<>();
while (true){
res.add(new UserTest());
}
}
}
class UserTest{
}
VM 添加参数
-Xms20m -Xmx20m
输出:
Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
at com.rumenz.OutOfMemory.main(OutOfMemory.java:11)
解释:
通过VM参数控制JVM的堆内存大小只有20m,程序不停的创建对象,而对象又是在堆上分配内存,一直不停的向List中添加对象,没有垃圾回收,导致堆内存溢出(OutOfMemoryError).
Mat工具分析堆
1.下载Mat分析软件:https://www.eclipse.org/mat/downloads.php
2.VM参数加上: -XX:+HeapDumpOnOutOfMemoryError开启堆内存溢出导出堆内存到文件,默认在项目的根目录下.如果需要指定其它路径用-XX:HeapDumpPath=/tmp,会生成一个名字类似的java_pid28790.hprof文件.
3.使用Mat打开hprof文件
java.lang.Object[14053]含义:List本质上就是Object[]数组,14053就是里面存放的对象的个数.
Shallow Heap (浅层堆)表示:对象实际占用的堆大小(不包含其它引用对象的大小)
Retained Heap(保留堆)表示:对象实际占用+所包含引用对象的大小
Shallow Heap计算方法
在本次案例中:Shallow Heap占用112448字节,Retained Heap占用337296字节.
List res=new ArrayList<>(); res是局部变量,在栈上分配内存,res中存放的是UserTest实例对象的堆内存地址(引用),JDK1.8中打开指针压缩(-XX:+UseCompressedOops),在64位系统引用就占4个字节,未打开指针压缩64位系统中引用指针占用8个字节.
当前案例未打开指针压缩:
14053个引用地址占用内存大小: 14053*8=112424
,Shallow Heap
占用112448
字节,还有24字节明显就是res容器本身占用的内存大小.
数组浅堆占用内存计算:
16 bytes of overhead 对象的头
4 bytes length 存储容器长度
4 bytes padding 字节对其
16 bytes of overhead + 4 bytes length + 4 bytes padding = 24 bytes
Retained Heap计算方法
Retained Heap Size=Shallow Heap Size+引用对象实际大小
Shallow Heap 已经计算出来了 引用对象的实际大小:本案例中,由于UserTest是一个空的对象,所以每个UserTest实例对象就只占用16字节的对象头.总共有14053个实例对象,所以共占用14053*17=224848.
Retained Heap=112424+224848=337296和Mat分析的结果一致.
相关文章
- Win10 JAVA安装及环境搭建(windows jdk,windows java环境配置)
- Java内存溢出(OOM)分析
- 大杂烩 -- Java内存布局【图】以及java各种存储区【详解】
- Java -- IO -- 目录
- Java Date Time 教程-java.util.Date
- Java内存模型
- 深入理解Java内存模型(二)——重排序
- 一个Java程序员第四年工作总结
- Java并发JUC(java.util.concurrent)JMM内存模型
- 最新秋招,Java八股文!含答案,JAVA核心知识点最详细版(面试必备)
- 13 数组 Java内存分析 三种初始化
- Java开发环境的搭建以及使用eclipse从头一步步创建java项目
- 【Java】+获取Linux服务器的CPU、内存使用率
- java路径信息
- Java内存模型的历史变迁
- 《Java遗传算法编程》—— 1.10 终止
- Java内存泄漏分析和解决
- Java学习-084-java.sql.SQLException: Zero date value prohibited 问题解决
- 在java中使用JMH(Java Microbenchmark Harness)做性能测试
- 浅析Java如何使用@ControllerAdvice、@ExceptionHandler进行全局统一异常处理、如何使用@responseBodyAdvice进行全局统一返回值处理
- 浅析JVM与Java内存区
- Java之throw和throws的区别及java中的异常处理
- Java实现文件下载Zip压缩
- Java学习---JAVA的类设计
- JAVA学习.java.sql.date 与java.util.date以及gettime()方法的分析
- Java中的final如何理解——详解
- 深入理解Java虚拟机02--Java内存区域与内存溢出异常
- 对多线程java内存模型JMM
- 深入理解Java虚拟机-Java内存区域透彻分析
- 深入理解Java虚拟机-Java内存区域透彻分析
- java AWT弹球游戏
- Java实现给PDF文件加文字水印和图片水印(可以自定义水印格式)