[面试题]java程序内存泄漏怎么排查

2023-11-02

上文提到面试碰到CPU占满时的问题解决,决心把内存泄漏的问题也一起看一看,如果有更好的方案,评论区请指教。

首先了解几个命令

pId 为程序id

# 获取当前linux上部署的所有java程序 pid和运行占有资源情况(俩个都可以)
ps -aux|grep java
top $(ps -e | grep java | awk '{print $1}' | sed 's/^/-p/')
#获取某个java程序所有线程资源占用情况
top -Hp [pId]
# 获取某个java程序的线程执行情况(会展示在哪个类的哪一行)
jstack   [pId]
# 获取某个java程序的gc情况
jstat -gcutil  [pId] 
# 获取某个java程序的gc情况 每秒获取一次 获取10次
jstat -gcutil  [pId]  1000 10
# 将某个java程序的heap(堆)情况写入heap.hprof文件
 jmap -dump:format=b,file=heap.hprof  [pId]

怎么判断当前程序有没有出现内存溢出

模拟代码

ps: 模拟代码大概要执行10分钟才会溢出,可以加入多个String多个集合实现快些。

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

/**
 * @Author 打工人
 * @Date 2022/4/4 下午9:14
 * @Version 1.0
 * @Remarks
 */
public class SystemOOMTest {

    public static final String SYSTEM_OOMTEST_STR = "SYSTEM_OOMTEST_STR";
    public static void main(String[] args) {
        int i = 0;
        String thisStr;
        List<String> oomObjs = new ArrayList<String>();
        while (true){
            thisStr = SYSTEM_OOMTEST_STR + i++;
            oomObjs.add(thisStr);
            try {
                Thread.sleep(100L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(thisStr);
        }
    }

}

模拟步骤

jvm初始和最大内存设置2M运行

javac SystemOOMTest2.java
java -Xms2M -Xmx2M SystemOOMTest2

判断依据

每10秒展示一次gc 获取10次

jstat -gcutil 13869 10000 10

请添加图片描述
想了解图中每一项参数点这里
E为Edan区,新创建的string对象都会放在该区,图中展示的是占用比例。
jvm的对象创建机制为先存储Edan区(大对象会直接存储在Old区),存满后,执行YGC,没有被GC到的对象复制到S0或者S1区,都存满还是没有可用内存的话将S区的对象存储在O(Old)区,Old区存满之后执行FGC(FullGC)。

java程序内存溢出判断的大依据为FGC的次数,如果FGC次数很频繁且每次GC完释放的内存很少就有可能是出现了内存溢出。(为什么是有可能呢,因为也有情况是内存确实不够用)

出现内存溢出怎么办

最原始的方法

将java程序的堆占用情况输出到heap.hprof文件中,然后使用解析工具进行解析,解析完成之后查看实例占用多的类。然后进入代码分析,查看为什么没有被回收。
format=b:表示生成二进制类型的dump文件
PS: 执行下面语句jvm会执行一次FGC,并且会造成程序挂起(线上慎用)。文件大的话在解析时也会很慢。

 jmap -dump:format=b,file=heap.hprof [pId]

使用JProfiler解析hprof文件

在这里插入图片描述

在线dump文件分析网站https://console.heapdump.cn/

在这里插入图片描述

MAT

楼主最开始也尝试的这个工具,不过 MAC上面安装的1.8.0版本的,打开解析面板是空白的。

第二种方案

最好能在本地复盘。通过查看线上日志,和近期的发版内容,用户增量一起结合起来看。毕竟线上真遇见了,堆内存占用会很大,在写出的时候java程序会挂起,影响运行。

代码层面最好避免这种情况,使用完的对象和集合要确定会不会被jvm正常GC掉。

PS:堆中的实例对象GC依据为 当前实例对象还有无地方引用。

总结

  1. 定位到内存占用过高的java程序pid
  2. 查看java程序的gc情况
  3. 如果FGC次数很频繁 导出一份heap数据
  4. 使用解析工具解析heap

其他:注意代码规范,使用完的实例对象要确保能被回收掉。

希望本文可以帮到你。

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

[面试题]java程序内存泄漏怎么排查 的相关文章

  • 如何在ArrayList中的特定位置插入对象

    假设我有一个大小为 n 的对象的 ArrayList 现在我想在特定位置插入另一个对象 假设在索引位置 k 大于 0 且小于 n 并且我希望索引位置 k 处及其之后的其他对象向前移动一个索引位置 那么有没有什么方法可以直接在Java中做到这
  • JAVA 中的 Composer 相当于什么? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我目前从 PHP 转向 java 有没有类似的工具composer https getcomposer org 在 PHP 中用于 JAV
  • Java,顺序流在哪个线程中执行?

    在阅读有关流的文档时 我遇到了以下句子 attempting to access mutable state from behavioral parameters presents you with a bad choice if you
  • Hashset - 创建 Set 后使对象相同

    如果我们在 HashSet 中添加两个不同的对象 可变的 然后通过调用 setter 更改对象的值 使它们相同 则大小仍然是 hashSet 的 2 我无法理解其原因 public static void main String args
  • 垂直 ViewPager 中的动画

    我需要垂直制作这个动画ViewPager https www youtube com watch v wuE 4jjnp3g https www youtube com watch v wuE 4jjnp3g 这是我到目前为止所尝试的 vi
  • 如何从 Java 访问 Windows 设备管理器中的信息?

    我有一个串行 USB 设备 并且其中多个设备可以连接到计算机 我需要查询和检索设备连接到的 COM 端口列表 在 Windows 设备管理器中 您可以获得当前连接的设备的 COM 端口 友好名称 该列表是动态的 从注册表中读取不工作 htt
  • H2数据库:如何进行加密保护,而不暴露文件加密密钥

    我们在服务器模式下使用Java H2数据库 因为我们不希望用户访问数据库文件 为了对数据库文件添加更多保护 我们计划使用 AES 加密 将 CIPHER AES 添加到数据库 URL 以防存储被盗 但是 每个用户在连接时还需要提供文件保护密
  • 未注入带有 JPA2 的 Apache Ignite 2.7 IgniteRepository

    使用在 Web 上建立的 guildes 我使用 Spring Data JPA 2 应用程序制作了简单的 Spring Boot 2 仅在 2 7 版本中才向 Apache Ignite 添加了 Spring Boot JPA 2 支持
  • 使用 kryo 注册课程的策略

    我最近发现了 kryonet 库 它非常棒并且非常适合我的需求 然而 我遇到的一个问题是制定一种好的策略来注册所有可以转移的类 我知道我可以在每个对象中编写一个静态方法 该方法将返回它使用的所有类的列表 但我真的不想这样做 为了我自己的时间
  • 在拇指上方显示修改后的 JSlider 值

    有没有一种简单的方法可以在使用某些 外观和感觉 的同时更改 JSlider 上方标签中显示的值 为了清楚起见 我正在谈论这个值 具体来说 我想显示除以 1000 的值而不是值本身 我知道如果我显示它们 我可以为刻度设置标签 但用户将不得不猜
  • for循环中更新JLabel的问题

    我的程序的想法是从之前在其他 JFrame 中保存的列表中选择一个名称 我想在标签中一个接一个地打印所有名称 它们之间有很小的延迟 然后停在其中一个名称上 问题是lbl setText String 如果有多个则不起作用setText co
  • 膨胀类 android.support.design.widget.NavigationView 时出错

    我按照 NavigationView 的教程进行操作 但无法解决此错误消息 Error inflating class android support design widget NavigationView 教程链接 https www
  • JERSEY:错误跟踪:java.lang.IllegalStateException:实体输入流已关闭

    我正在使用 Jersey 2 x 以下是我的控制器 GET Path id Produces application json public Response getUser PathParam id int userId Context
  • Java HashSet 是线程安全的只读吗?

    如果我通过 Collections unmodifyingSet 运行 HashSet 实例后 它是线程安全的吗 我问这个是因为 Set 文档声明它不是 但我只是执行读取操作 来自 Javadoc 请注意 此实现不是同步的 如果多个线程同时
  • Janusgraph 0.3.2 + HBase 1.4.9 - 无法设置 graph.timestamps

    我在 Docker 容器中运行 Janusgraph 0 3 2 并尝试使用运行 HBase 1 4 9 的 AWS EMR 集群作为存储后端 我可以运行 gremlin server sh 但如果我尝试保存某些内容 我会得到粘贴在下面的堆
  • 开发者环境-如何调用/消费其他微服务

    背景 我的环境 Java Play2 MySql 我在 Play2 gt S1 S2 S3 上编写了 3 个无状态 Restful 微服务 S1 消耗来自 S2 和 S3 的数据 因此 当用户点击 S1 时 该服务会异步调用 S2 S3 合
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • Java 中序列化的目的是什么?

    我读过很多关于序列化的文章 以及它如何如此美好和伟大 但没有一个论点足够令人信服 我想知道是否有人能真正告诉我通过序列化一个类我们真正可以实现什么 让我们先定义序列化 然后我们才能讨论它为什么如此有用 序列化只是将现有对象转换为字节数组 该
  • Unicode(希腊语)字符存储在数据库中,例如“??????”

    数据库中的希腊字符就像问号 我找不到解决办法 我使用 Java Swing 开发了一个应用程序 但是当我在 MySQL 中插入希腊字母时 就像问号一样 我将数据库排序规则更改为 utf8 并将列也更改为 utf8 我的项目编码设置为UTF
  • Android ClassNotFoundException:在路径上找不到类

    10 22 15 29 40 897 E AndroidRuntime 2561 FATAL EXCEPTION main 10 22 15 29 40 897 E AndroidRuntime 2561 java lang Runtime

随机推荐

  • 从辩证的角度看待chatGPT,我们该如何对待?

    从辩证的角度 看待chatGPT 0 什么是ChatGPT 客观阐述 1 通过唯物辩证法的五对基本范畴进行分析 1 0 内容与形式 1 1 现象和本质 1 2 原因与结果 1 3 必然与偶然 1 4 现实与可能 2 使用ChatGPT会给我
  • SPADE(GauGAN)代码运行方法

    SPADE运行方法 写在前面 为什么Pix2PixHD和SPADE都不用RGB作为输入 如何运行SPADE 可能遇到的问题 2022 04 28更 如何控制合成风格 2022 07 30更 contain dontcare label参数
  • 暗影精灵5怎么调风扇转速_遗憾与真香并存的性价比产品——暗影精灵6 AMD

    惠普暗影精灵6 AMD作为一台正面与联想拯救者R7000P对线的游戏本 自有消息以来就被玩家们寄托了很高的希望 纵然随着暗影精灵6 AMD的发布 大家对其期待值有所降低 但在如今游戏本集体无货的情况下它也是一个不错的选择 本文基于目前拿到的
  • 数据结构 算法大全 入门篇

    说到数据结构是什么 我们得先来谈谈什么叫数据 正所谓 巧妇难为无米之炊 再强大的计算机 也是要有 米 下锅才可以干活的 否则就是一堆破铜烂铁 这个 米 就是数据 数据 是描述客观事物的符号 是计算机中可以操作的对象 是能被计算机识别 并输入
  • vscode配置remote ssh

    1 安装插件 vscode配置remote ssh Hello wshuo的博客 CSDN博客 remote ssh vscode 设置界面 右键最左边tab栏 主体 vscode 插件 Remote SSH Linux主体 vscode
  • 【Complex-YOLO: 点云实时目标检测】

    Complex YOLO 点云实时目标检测 前言 要点分析 具体算法分析 点云转化鸟瞰图 提取特征 B Box损失回归 前言 Complex YOLO 论文中介绍是一种仅在点云上进行的最先进的实时3D目标检测网络 借鉴了yolo v2的主干
  • Java语言实现word转PDF(10分钟解决)

    前言 经常做OA办公项目的同学一定和我一样被各种线上的office操作整疯了 基本上涉及到Java操作office的时候就会想到POI和openoffice 这两种方案都是需要找各种jar包 然后用里面繁杂的api 关键是做出来的文件格式有
  • ORA-28002 & PASSWORD_LIFE_TIME & PASSWORD_GRACE_TIME

    Normal 0 7 8 磅 0 2 false false false EN US ZH CN X NONE PASSWORD LIFE TIME 设置的是数据库开始报告ORA 28002密码要过期的时间 PASSWORD GRACE T
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • 【转载】odoo技术开发白皮书 第一部分 第九章 权限

    转载 http book odoomommy com chapter1 README8 html 第九章 权限 Odoo的权限管理 从粗到细可以大概分为四个等级 对象级 视图级 字段级 记录级 什么意思呢 总结起来大概如下面的描述 对象级
  • 大家的毕业设计怎么做的?跟我一样吗?无极低码说你:只管建库建表,剩下的交给我

    首先呢 介绍一下无敌低代码平台 无极低代码平台是作者自己搭建的一个框架 刚开始由3行代码写服务升级而来 3行代码写服务当然也是作者自己写的 目的就是为了减少基础的开发工作 让不会后端开发的人员能够通过简单的步骤实现服务接口的编写 后面觉得3
  • 对比 Exception 和 Error,运行时异常与一般异常有什么区别?

    相同点 Exception 和 Error 都是继承了 Throwable 类 在 Java 中只有 Throwable 类型的实例才可以被抛出 throw 或者捕获 catch 它是异常处理机制的基本组成类型 Exception 和 Er
  • vue5种方式实现页面“刷新“

    vue中五种方式实现页面 刷新 1 使用window location reload 强制刷新 都会使页面有短暂的空白 体验效果不是特别好 home vue
  • 提高生活、学习、工作效率的方法——时间管理Vs个人管理

    首先 我想对于大家来说 时间管理这个词应该并不陌生 不过 在开会之前 又有几个知道呢 反正我当时并不知道 这就需要反思了 不过这里 先不做反思 先说说时间管理 初次接触到这个词 我想的是 为什么要管理 怎样进行时间管理 该怎么管理 随后 米
  • 12. 集群调度

    文章目录 简介 调度过程 自定义调度器 调度亲和性 Node亲和性 preferredDuringSchedulingIgnoredDuringExecution requiredDuringSchedulingIgnoredDuringE
  • 针对于MLE和MLP的代码例子实现

    背景 首先该例子来源于CSDN 详解最大似然估计 MLE 最大后验概率估计 MAP 以及贝叶斯公式的理解 nebulaf91的博客 这里的代码作为对上述内容的补充和实现 代码 import numpy as np import matplo
  • SSD接口种类

    转自微信公众号 存储随笔 随着SSD价格的不断下降以及SSD性能的不断提升 越来越多的朋友开始考虑给自己的电脑升级SSD固态硬盘 但是市面上现在SSD的根据不同的大小与尺寸 有多种多样的接口的SSD 本篇文章就当下主流的一些SSD接口进行简
  • OpenStack核心组件-horizon web 界面管理

    1 horizon 介绍 Horizon Horizon 为 Openstack 提供一个 WEB 前端的管理界面 UI 服务 通过 Horizone 所提供的 DashBoard 服务 管理员可以使用通过 WEB UI 对 Opensta
  • Oracle 批量提交,批量绑定 OCIBindByName 和OCIBindObject 的使用

    穷遍所有OCI文档找不出一个能绑定多行数据的说明和示例 自己尝试快两周解决了Oracle Spatial 批量绑定将Oracle的写入效率提升到了5000行左右 以下是一点心得 Oracle OCI 基本操作 本文不多说 假设你会用基本的O
  • [面试题]java程序内存泄漏怎么排查

    java程序内存泄漏怎么排查 首先了解几个命令 怎么判断当前程序有没有出现内存溢出 模拟代码 模拟步骤 判断依据 出现内存溢出怎么办 最原始的方法 使用JProfiler解析hprof文件 在线dump文件分析网站https console