前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java内存溢出OOM使用Mat分析

Java内存溢出OOM使用Mat分析

作者头像
入门笔记
发布2022-06-02 16:14:06
5510
发布2022-06-02 16:14:06
举报
文章被收录于专栏:入门小站入门小站

示例

代码语言:javascript
复制
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 添加参数

代码语言:javascript
复制
-Xms20m -Xmx20m

输出:

代码语言:javascript
复制
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文件

image-20201014114417693

java.lang.Object[14053]含义:List<UserTest>本质上就是Object[]数组,14053就是里面存放的对象的个数.

  • Shallow Heap (浅层堆)表示:对象实际占用的堆大小(不包含其它引用对象的大小)
  • Retained Heap(保留堆)表示:对象实际占用+所包含引用对象的大小

Shallow Heap计算方法

在本次案例中:Shallow Heap占用112448字节,Retained Heap占用337296字节.

List<UserTest> res=new ArrayList<>(); res是局部变量,在栈上分配内存,res中存放的是UserTest实例对象的堆内存地址(引用),JDK1.8中打开指针压缩(-XX:+UseCompressedOops),在64位系统引用就占4个字节,未打开指针压缩64位系统中引用指针占用8个字节.

代码语言:javascript
复制
当前案例未打开指针压缩:
14053个引用地址占用内存大小: `14053*8=112424`,`Shallow Heap`占用`112448`字节,还有24字节明显就是res容器本身占用的内存大小.

数组浅堆占用内存计算:

代码语言:javascript
复制
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.

代码语言:javascript
复制
Retained Heap=112424+224848=337296和Mat分析的结果一致.

相关文章

JVM,JRE,JDK之间的区别和联系

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 入门小站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Mat工具分析堆
  • Shallow Heap计算方法
  • Retained Heap计算方法
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档