JProfile 分析OOM hprof文件

2023-11-02

JProfile 分析OOM OutOfMemoryError

1.JVM组成

首先要明白JVM组成

  1. 方法区-非堆 Method Area、No-Heap
  2. Java栈-虚拟机栈 VM Stack、Java Stack
  3. 本地方法栈 Native Method Stack
  4. 程序计数器 Program Counter Register
  5. 堆 Heap
1.1 OOM发生在哪里?

OOM可以发生在除了程序计数器外的其他部分,包括四块:

  • 方法区(非堆)
  • Java栈
  • 本地方法栈
1.2 垃圾回收、哪里有垃圾?
  • 方法区(非堆)
1.3 基本JVM参数
参数示例 描述说明
-verbose:gc 控制台打印GC参数
-Xms20M 初始堆大小 20M
-Xmx20M 最大堆大小20M 一般情况下-Xms和-Xmx这两个值设为相同大小。因为如果不相同
-Xmn10M 新生代最大可用值10M
-XX:+PrintGC 触发GC时日志打印
-XX:+PrintGCDetails 触发GC时日志打印详细
–XX:UseSerialGC 串行回收
-XX:SurvivorRatio=2 eden:from:to =2:1:1
-XX:+HeapDumpOnOutOfMemoryErro OOM时生成Dump文件
-XX:NewRatio=2 新生代:老年代 = 1:2
2.堆发生OOM
2.1 代码

调整JVM参数

# -verbose:gc  控制台打印GC参数
# -Xms10M 初始堆大小
# -Xmx10M 最大堆大小 一般情况下-Xms和-Xmx这两个值设为相同大小。因为如果不相同且内存不够用时会发生内存抖动现象,影响程序运行
# -Xmn5M  新生代最大可用值5M
# -XX:+PrintGC  触发GC时日志打印
# -XX:+PrintGCDetails 触发GC时日志打印详细
# -XX:+HeapDumpOnOutOfMemoryError OOM时生成Dump文件
# -XX:SurvivorRatio=3 说明伊甸区 eden:from:to=3:1:1
-verbose:gc -Xms10M -Xmx10M -Xmn5M  -XX:PrintGC  -XX:PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:SurvivorRatio=10

运行代码

package com.jzj.jvmtest.oomtest;

import java.util.ArrayList;
import java.util.List;

/**
 * 堆溢出, 只要不停的新建对象,就会堆溢出
 */
public class HeapOOM {
    public static void main(String[] args) {
        System.out.print("最大内存: ");
        System.out.println(Runtime.getRuntime().maxMemory() / 1024 / 1024 + "MB");
        System.out.print("可用内存: ");
        System.out.println(Runtime.getRuntime().freeMemory() / 1024 / 1024 + "MB");
        System.out.print("已使用内存: ");
        System.out.println(Runtime.getRuntime().totalMemory() / 1024 / 1024 + "MB");

        List<HeapOOM> list = new ArrayList<>();
        while (true) {
            list.add(new HeapOOM());
        }
    }
}


2.2 OOM日志
最大内存: 18MB
可用内存: 15MB
已使用内存: 18MB
[GC (Allocation Failure) [PSYoungGen: 5595K->2040K(8192K)] 5595K->2997K(18432K), 0.0022678 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 8184K->2038K(8192K)] 9141K->7231K(18432K), 0.0053117 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[Full GC (Ergonomics) [PSYoungGen: 6144K->6144K(8192K)] [ParOldGen: 10123K->10123K(10240K)] 16267K->16267K(18432K), [Metaspace: 3500K->3500K(1056768K)], 0.1431659 secs] [Times: user=1.41 sys=0.00, real=0.14 secs] 
[Full GC (Ergonomics) [PSYoungGen: 6144K->6144K(8192K)] [ParOldGen: 10124K->10124K(10240K)] 16268K->16268K(18432K), [Metaspace: 3500K->3500K(1056768K)], 0.1269467 secs] [Times: user=1.09 sys=0.00, real=0.13 secs] 
[Full GC (Ergonomics) [PSYoungGen: 6144K->6144K(8192K)] [ParOldGen: 10125K->10125K(10240K)] 16269K->16269K(18432K), [Metaspace: 3500K->3500K(1056768K)], 0.1402382 secs] [Times: user=1.41 sys=0.00, real=0.14 secs] 
[Full GC (Ergonomics) [PSYoungGen: 6144K->6144K(8192K)] [ParOldGen: 10126K->10126K(10240K)] 16270K->16270K(18432K), [Metaspace: 3500K->3500K(1056768K)], 0.1276036 secs] [Times: user=1.13 sys=0.00, real=0.13 secs] 
[Full GC (Ergonomics) [PSYoungGen: 6144K->6144K(8192K)] [ParOldGen: 10127K->10127K(10240K)] 16271K->16271K(18432K), [Metaspace: 3500K->3500K(1056768K)], 0.1277889 secs] [Times: user=1.24 sys=0.00, real=0.13 secs] 
java.lang.OutOfMemoryError: GC overhead limit exceeded
Dumping heap to java_pid30128.hprof ...
Heap dump file created [27909929 bytes in 0.072 secs]
[Full GC (Ergonomics) [PSYoungGen: 6144K->0K(8192K)] [ParOldGen: 10179K->762K(10240K)] 16323K->762K(18432K), [Metaspace: 3542K->3542K(1056768K)], 0.0042329 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
Heap
 PSYoungGen      total 8192K, used 167K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
  eden space 6144K, 2% used [0x00000000ff600000,0x00000000ff629e60,0x00000000ffc00000)
  from space 2048K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x0000000100000000)
  to   space 2048K, 0% used [0x00000000ffc00000,0x00000000ffc00000,0x00000000ffe00000)
 ParOldGen       total 10240K, used 762K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)
  object space 10240K, 7% used [0x00000000fec00000,0x00000000fecbe9a8,0x00000000ff600000)
 Metaspace       used 3615K, capacity 4508K, committed 4864K, reserved 1056768K
  class space    used 394K, capacity 396K, committed 512K, reserved 1048576K
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
	at com.jzj.jvmtest.oomtest.HeapOOM.main(HeapOOM.java:20)

Process finished with exit code 1


2.3 日志分析
Eden-From-To分析

-XX:SurvivorRatio=3 说明2个Survivor 与Eden区的 大小比值为 2:3
以-Xmn = 10M 为例 10*1024KB / (2+3) = 2048KB/每一份
Eden有 3份也就是6M,From Survivor有2M,To Survivor有2M
对比日志

 PSYoungGen      total 8192K, used 167K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
  eden space 6144K, 2% used [0x00000000ff600000,0x00000000ff629e60,0x00000000ffc00000) -6M
  from space 2048K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x0000000100000000) -2M
  to   space 2048K, 0% used [0x00000000ffc00000,0x00000000ffc00000,0x00000000ffe00000) -2M
2.4 报错日志
Event: 5.271 GC heap after
Heap after GC invocations=39 (full 37):
 PSYoungGen      total 8192K, used 6143K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
  eden space 6144K, 99% used [0x00000000ff600000,0x00000000ffbffff8,0x00000000ffc00000)
  from space 2048K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x0000000100000000)
  to   space 2048K, 0% used [0x00000000ffc00000,0x00000000ffc00000,0x00000000ffe00000)
 ParOldGen       total 10240K, used 10140K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)
  object space 10240K, 99% used [0x00000000fec00000,0x00000000ff5e70f0,0x00000000ff600000)
 Metaspace       used 3500K, capacity 4500K, committed 4864K, reserved 1056768K
  class space    used 382K, capacity 388K, committed 512K, reserved 1048576K
}

eden space 6144K, 99% used [0x00000000ff600000,0x00000000ffbffff8,0x00000000ffc00000) Eden区 占用99%说明程序在不停的新建对象,一直把Eden 占满了 ,而且 触发YongGC后,看一下YGC的日志

[GC (Allocation Failure) [PSYoungGen: 5595K->2040K(8192K)] 5595K->2997K(18432K), 0.0022678 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 

PSYoungGen: 5595K->2040K(8192K)
年轻代垃圾回收前5595K,年轻代回收后 2040K, 年轻代总大小一共8192K
整个堆回收前大小5595K,整个堆回收后2997K,整个堆一共大小18432K~=18M

3.JProfile 分析Dump文件
3.1 打开JProfile

我们找到发生OOM时候,的Dump文件,然后用JProfile打开
在这里插入图片描述

3.2 找到最大的对象

最大的对象很有可能是当前OOM溢出的原因,可以看到最大的对象时HeapOOM这个对象,JVM中有81W个这样的对象
在这里插入图片描述

3.3 找到代码出错的位置

选中当前对象,右键 -> Use selected Objects
在这里插入图片描述
点击OK
在这里插入图片描述
选中 Incoming references
在这里插入图片描述
点击 show more
在这里插入图片描述

3.4 定位到代码行号

可以看到 com.jzj.jvmtest.oomtest.HeapOOM.main(java.lang.String[ ]) (line: 20)
Main函数的 20行 进行了ArrayList.add 操作 ,导致OOM
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JProfile 分析OOM hprof文件 的相关文章

  • chrome谷歌浏览器安装教程 20200701

    官网地址 https www google cn chrome 下载 下载并安装 安装完成 查看版本
  • 常见网络安全名词

    常见网络安全名词 木马 木马是指恶意代码伪装成正常的程序 当被运行时 会获取到整个系统的权限 比如往年的灰鸽子 蜜蜂大盗等 木马基本有四个特征 隐蔽性 欺骗性 顽固性和危害性 木马种类繁多 网页木马 网页木马是指恶意网页伪装成正常的页面 如
  • 学编程和乐高机器人的区别

    学编程和乐高机器人的区别 小孩的学习一直都是很多家长们十分关心和重视的一件事情 很多的家长在培养孩子的学习的时候 会给孩子选择一些能够提升孩子能力的课程 就拿现在很多的家长想要孩子去学习机器人编程的课程来说 有的家长对于学编程和乐高机器人的
  • 【Vuex】状态管理

    文章目录 优势 核心概念 State mapState辅助函数 Getter 通过属性访问 通过方法访问 mapGetters 辅助函数 Mutation 可以传参 对象风格的提交方式 Mutation 必须是同步函数 在组件中提交 Mut
  • springboot启动后,执行某个方法的实现方式

    1 注解 PostConstruct 直接在方式上面加注解 但是会影响服务提供 比如这个方法要执行五分钟 这五分钟之内是无法提供服务的 这个方法是在服务初始化后之前运行 所以 此方法运行不结束 服务就无法初始化 构造函数 Autowired
  • log日志配置简述

    近期进行log升级 简单配置了下几种常用日志 分别是log4j log4j2 logback 简单整理 不全不深 仅备后用 需求 将应用日志以控制台或文件的形式输出 一 log4j 1 引入jar包 下载并引入log4j的jar包 log4
  • 蓝桥杯真题javaB第三题:振兴中华

    第三题 振兴中华 题目描述 小明参加了学校的趣味运动会 其中的一个项目是 跳格子 地上画着一些格子 每个格子里写一个字 从我做起振 我做起振兴 做起振兴中 起振兴中华 比赛时 先站在左上角的写着 从 字的格子里 可以横向或纵向跳到相邻的格子
  • .net core 在ubuntu系统下保存图片到本地

    这就是一个坑 using MemoryStream ms new MemoryStream imgBts using Image img Image FromStream ms img Save tempPic jpg 原来在 net Fr
  • 12关于FFmpeg的四种时基和时基相关函数的分析及其场景用法

    12关于FFmpeg的四种时基和时基相关函数的分析及其场景用法 前言 AVRational类型 是一个分数 例如 1 25 表示1除以25即1 25 时基 时间的单位 在ffmpeg下被描述成时基 时间戳 某个时刻的时间 1 FFmpeg的
  • vs更换本地git账号

    有人认为vs中用的git账号是哪个无所谓 其实不然 git账号不同 访问的权限就不一样 那么如果想跟换git账号该怎么做呢 win7 控制面板 gt 用户帐户和家庭安全 gt 凭据管理器 编辑普通凭据中的git账号或者直接删除 然后重启vs

随机推荐

  • 响应式布局 与 Bootstrap

    一 响应式布局 1 什么是响应式布局 使用媒体查询针对不同宽度的设备进行布局和样式设置 从而实现适配不同设备的目的 2 响应式布局的容器 响应式需要一个父级做为布局容器 来配合子级元素来实现变化效果 原理就是在不同屏幕下 通过媒体查询来改变
  • configure移植技巧,绝对干货

    一 环境 主机 ubuntu 开发板 arm linux 二 configure分析 build host target介绍 build为主机环境 如ubuntu redhat等等 执行gcc v命令可以查看到Target变量 build
  • 【STM32+cubemx】0015 HAL库开发:内部flash读写

    本节我们来学习stm32内部flash的读写 在某些应用中 我们需要保存少量掉电仍然不丢失的数据 而在电路板上额外增加一块eeprom或者flash又太浪费硬件资源 这时我们就可以把这些数据保存在stm32内部的flash里 1 stm32
  • debian11 安装 postgress 数据库 -- chatGPT

    问 debian 安装 postgress 数据库 gpt 要在Debian上安装PostgreSQL数据库 您可以按照以下步骤进行操作 1 打开终端 您可以通过点击 应用程序 菜单 然后在 系统工具 或 终端 下找到终端应用程序 2 使用
  • 【100天精通Python】Day43:Python网络爬虫开发_爬虫基础(urlib库、Beautiful Soup库、使用代理+实战代码)

    目录 1 urlib 库 2 Beautiful Soup库 3 使用代理 3 1 代理种类 HTTP HTTPS 和 SOCKS5 3 2 使用 urllib 和 requests 库使用代理
  • 推荐一波Git学习资料

    关于Git的用法我们已经写七篇文章 介绍了Git的不少用法 这些足以应付工作中90 的需求了 剩下的10 就需要小伙伴们在工作中自己慢慢总结了 我这里再给小伙伴们推荐一点Git学习资料 为我们的Git系列画上一个句号 书 推荐两本个人觉得很
  • 2018第八届至2022年第十三届蓝桥杯单片机开放与设计省赛客观题及简解整理

    前言 由于本人马上要参加第十四届蓝桥杯单片机设计与开发的省赛了 在对客观题复习两轮后 发现效率是比较低的 因此整理了2018至2022年的省赛客观题 将大概的考点划分三部分 这样可以更加系统的复习其内容 现在把整理的这份内容分享给各位同学
  • 微信小程序的this.setData()方法更新二级属性数据

    在用this setData 更新数据时 如果要更新的数据如下 data person name xiaoming occupation front end engineer 要把person name更新为 xiaogang 我们如果通过
  • ElementUI 之 el-tabs添加自定义按钮

  • oauth2 jwt token 返回accessToken对象中携带用户字段信息

    oauth2 源码中用户信息只返回用户名称 现有需求要求返回userId 只能重写某些方法 server端和client端都要修改 方法一 结果 userId 封装在token中 需要解析access token才能看到 但是经测试发现 使
  • 【Java基础】Scanner中next与nextLine区别

    Scanner概念 scanner可以用来获取用户的输入 八个基本数据类型除字符外都可以输入 另外输入字符串有两种方式next与nextLine 接下来介绍他们的区别 1 next与nextLine的区别 1 1 区别一 String st
  • 上传AppStore 报错 ERRPR ITMS-90700

    小萌在解决乱七八糟的警告的时候 加入了Background Modes 然后就报了上述错误 把这个去掉之后重新打包 然后就顺利上线了
  • win10上python3密码库pycryptodome使用

    环境安装 python 在 Windows下使用密码库时要安装的是pycryptodome模块 pip install pycryptodome python 在 Linux下使用密码库时要安装的是pycrypto模块 pip instal
  • C/C++中字符串数组及strlen()和sizeof()区别

    1 字符串数组 标准C语言中没有字符串 string 类型 而只是在C 后添加了字符串string类 但是并不属于基础数据类型 只是类功能很强大 得到广泛应用 所以一般我们平时处理字符串 即字符序列 使用的都是字符串数组 1 1 字符串数组
  • 提升企业网络安全的重要性:EventLog Analyzer的角色

    在今天的数字时代 企业对网络安全的需求愈发迫切 随着互联网的不断发展和企业信息的数字化 网络攻击的威胁也不断增加 为了保护企业数据和系统的完整性 网络安全已经成为每个企业都必须认真对待的重要问题 在这个背景下 我们不得不提到一种强大的工具
  • SSM+mysql课程题库管理系统-计算机毕业设计源码18655

    摘 要 随着科学技术的飞速发展 各行各业都在努力与现代先进技术接轨 通过科技手段提高自身的优势 对于课程题库管理系统当然也不能排除在外 随着网络技术的不断成熟 带动了课程题库管理系统 它彻底改变了过去传统的管理方式 不仅使服务管理难度变低了
  • ENVI_IDL: 基础语法详解

    01 题目 02 代码说明 题目本身很简单 但是我自己加了一些东西进去增加难度 主要包括print函数的封装 格式化字符串 但是不影响代码的阅读 注 对于没有语言基础的人而言相对阅读困难 但是由于IDL是解释型语言 类似于Python 所以
  • 【PyTorch】如何取得预训练模型的标签label列表(以 Alexnet 在 ImageNet 上的预训练模型为例)

    PyTorch 预训练模型 PyTorch 提供过了大量的预训练模型可以直接拿来使用 或者进行增量训练和微调 拿 Alexnet 的预训练模型为例 import torch import torchvision model torchvis
  • Ubuntu系统下 .7z 文件压缩解压命令

    安装软件 sudo apt install p7zip full 解压文件 解压命令 7z x filename 7z r o test 参数说明 7z 解压缩文件命令 x 表示解压缩 r 表示递归解压缩所有的子文件夹 o 指定解压到的那个
  • JProfile 分析OOM hprof文件

    JProfile 分析OOM OutOfMemoryError 1 JVM组成 首先要明白JVM组成 方法区 非堆 Method Area No Heap Java栈 虚拟机栈 VM Stack Java Stack 本地方法栈 Nativ