55 处理错误的树形数据结构导致不断地添加元素到集合中 OOM

news2024/11/14 6:13:07

前言

呵呵 这是最近一个 前同事/朋友 碰到的一个问题 

主要的问题是 在 dump 文件中发现了很多 LinkedList$Node 的节点 

然后 整个问题 抛出来的错误是 OOM 

呵呵 这种问题 还是相当好处理的 

这里 仅仅是 简单记录一下 

前因

后果

测试用例

/**
 * Test11OomByTree
 *
 * @author Jerry.X.He <970655147@qq.com>
 * @version 1.0
 * @date 2022-07-07 22:04
 */
public class Test11OomByTree {

    /**
     * 模拟数据源
     */
    public static Map<Long, Tree> dataSource = new HashMap<>();

    //准备数据
    static {
        //循环数据
        Tree parent = new Tree(1L, "父类", 2L);
        Tree son = new Tree(2L, "子类", 1L);

        dataSource.put(parent.getId(), parent);
        dataSource.put(son.getId(), son);
    }

    // -Xms128M -Xmx128M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Users/jerry/IdeaProjects/HelloWorld/target/Test11OomByTree.hprof
    public static void main(String[] args) {
        //入参
        Tree param = new Tree(1L, "父类", 2L);
        //返回
        List<Tree> vos = new LinkedList<>();

        while (null != param.getParentId()) {
            Tree parent = getTreeByParentId(param.getParentId());
            vos.add(parent);
            //死循环
            param = parent;
        }
    }


    /**
     * mock查询方法
     *
     * @param parentId
     * @return
     */
    public static Tree getTreeByParentId(Long parentId) {
        return dataSource.get(parentId);
    }

    /**
     * 树状结构类
     */
    static class Tree {

        /**
         * id
         */
        private Long id;

        /**
         * 名称
         */
        private String name;

        /**
         * 父类ID
         */
        private Long parentId;

        public Tree(Long id, String name, Long parentId) {
            this.id = id;
            this.name = name;
            this.parentId = parentId;
        }

        public Long getId() {
            return id;
        }

        public void setId(Long id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Long getParentId() {
            return parentId;
        }

        public void setParentId(Long parentId) {
            this.parentId = parentId;
        }
    }

}

现象为 最终产生 OOM 

堆 dump 文件可以使用 jvisualVM 或者 jhat 或者 sa 自己处理 都行 

我们这里以 jhat 为例, 最常见 适用的场景最多 

dump 文件分析

jvisualVM 的 class stats 结果

jhat 的 class stats 

从这个问题 反推也很简单 

抽样 是来一个 LinkedList$Node, 然后 查看一下 这些 Node 指向的对象, 然后 再结合业务代码 看一下 多半问题就出来了 

这里随便抽样几个 

 

 

可以看到的是 随便抽样了 五个 LinkedList$Node

其中三个 指向的是 com.hx.test13.Test11OomByTree$Tree@0x7bcdd4888 (40 bytes)

两个指向的是 com.hx.test13.Test11OomByTree$Tree@0x7bcdcc8a8 (40 bytes)

然后 分别点击 这两个 oop 查看详情

可以看到的是 一个 oop 为类型为  Test11OomByTree$Tree 的 name 为 “父类” 的节点, 一个是 Test11OomByTree$Tree 的name 为 "子类" 的节点 

然后 再根据 这些业务信息 结合业务代码 查找 即可找到问题的根源 

 

 完

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/131786.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于2022年

也算是传统了&#xff0c;每年到年底的时候&#xff0c;总喜欢做点总结&#xff0c;或许类似于企业里面的年底复盘&#xff0c;但更多的还是碎碎念。往年一般会放在农历新年那一天&#xff0c;今年做点小改变&#xff0c;影响不大。 回顾过去的一年&#xff0c;发现自己基本上…

【HR-VITON】虚拟换衣算法pre-processing复现全过程记录

Link of original Github repo Link of personal made study case of HR-VITON ContentPre1、OpenPose&#xff08;On colab, need GPU&#xff09;2、Human ParseMethod 1: ColabMethod 2: Local or Server3、DensePose (On colab, GPU or CPU)4、Cloth Mask (On colab, GPU o…

【MySQL】InnoDB数据页结构

文章目录1. 前言2. 数据页结构3. 记录在页中的存储4. 记录头信息5. 页目录&#xff08;Page Directory&#xff09;6. 页面头部&#xff08;Page Header&#xff09;7.文件头部&#xff08;Fiile Header&#xff09;8. 文件尾部&#xff08;File Trailer&#xff09;不知不觉20…

JVM调优相关说明

前言 其实听着JVM调优这个词有些高大上&#xff0c;但是等你真正了解了他的内在原理后&#xff0c;还是很容易的。再简单 JVM调优大致可分为如下&#xff1a; 解决JVM运行过程中的问题&#xff08;主要就是内存溢出的问题&#xff09;优化JVM运行时的环境&#xff0c;提高运…

多线程问题(四)

目录 一、常见的锁策略 1、乐观锁 VS 悲观锁 2、读写锁 VS 普通的互斥锁 3、重量级锁 VS 轻量级锁 4、挂起等待锁 VS 自旋锁 6、公平锁 VS 非公平锁 7、可重入锁 VS 不可重入锁 8、synchronized锁的性质 二、CAS 1、CAS的伪代码 2、CAS的应用 a、实现原子类…

【Spring系列】一篇文章开启你的 SpringBoot 之旅

SpringBoot 快速入门一. 环境搭建1.1 环境准备Java环境准备(本人是 JDK 1.8)开发工具 IntelliJ IDEAMaven (可使用 IntelliJ IDEA 自带)二. 快速开始2.1 新建项目打开IDEA 新建 SpringBoot 项目2.2 运行项目Spring Boot 项目运行分析尝试在浏览器中访问2.3 完成第一个接口新建c…

ArcGIS基础实验操作100例--实验30清除坐标系信息

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验30 清除坐标系信息 目录 一、实验背景 二、实验数据 三、实验步骤 方法一&#xff…

运维管理平台OEM定制集成开发,激发IT价值

对硬件设备商而言&#xff0c;借助优秀的网管、运维管理平台&#xff0c;可以形成完整的产品解决方案&#xff0c;直接提升产品的形象和适用范围。同时还可以通过网管、运维管理平台&#xff0c;切入到外围的产品及集成领域&#xff0c;并在用户后续的升级改造活动中占据有利位…

12.31日报

纠正前天的错误&#xff1a; 前天我写&#xff1a; 不知道在mapper中的增删改方法返回值int的值&#xff0c;和含义&#xff0c;在调用方法时也没有定义int来接参&#xff0c;都是直接调用。于是我定义int i&#xff0c;并打印输出&#xff0c;使用postman调用接口方法&#xf…

R语言hdnom包进行高维惩罚 Cox 回归模型绘制列线图-校准曲线-时间依赖ROC-外部验证

Hdnom包可以用于用于给高维数据构建Cox 模型、绘制列线图-校准曲线-时间依赖ROC-外部验证&#xff0c;而且Hdnom包简化了建模过程&#xff0c;带有自动选择变量功能&#xff0c;将用户从繁琐且容易出错的调参过程中解放出来. hdnom提供了多项自动调参和模型选择功能&#xff…

【OpenAI】基于 Gym-CarRacing 的自动驾驶项目 | 前置知识介绍 | 项目环境准备

猛戳&#xff01;跟哥们一起玩蛇啊 &#x1f449; 《一起玩蛇》&#x1f40d; &#x1f4ad; 写在前面&#xff1a; 本篇是关于多伦多大学自动驾驶专业项目 Gym-CarRacing 的博客。GYM-Box2D CarRacing 是一种在 OpenAI Gym 平台上开发和比较强化学习算法的模拟环境。它是流行…

jscharting.js v3.3.1.20220428 Crack

jscharting.js 3.3 版带来了主要的新组织结构图和甘特图扩展&#xff0c;包括甘特关键路径图、组织连接线样式和选择、仪表板小部件、象形图等等。图表渐变支持扩展到包括图标和动态点和系列渐变填充。 JSCharting 团队使用新功能、图表类型和图表小部件制作了超过 55 个高级示…

从发展的趋势来看,数字技术理应是产业互联网时代的驱动力

事实上&#xff0c;以往&#xff0c;我们所经历的那个互联网玩家频出的年代&#xff0c;其实就是一个以互联网技术为主导的年代。在那样一个年代里&#xff0c;互联网技术几乎是解决一切痛点和难题的万能解药&#xff0c;几乎是破解一切行业痛点和难题的杀手锏。任何一个行业&a…

【Java语言】—顺序结构、分支结构

流程控制语句 Java提供了一些流程控制语句&#xff0c;来控制程序的执行流程。 1.顺序结构 按照代码的先后顺序&#xff0c;以此执行程序。 2.分支结构 &#xff08;1&#xff09;if分支 根据判断的结果&#xff08;真或假&#xff09;决定执行某个分支的代码。 if分支有三…

Docker+Nginx打包部署前后端分离项目

DockerNginx打包部署前后端分离项目1、问题描述2、项目打包2.1 前端项目打包2.1.1 修改vue.config.js文件2.1.2 router配置中添加base属性2.1.3 打包前端项目2.2 后端项目打包2.3 将前端和后端的打包文件上传到服务器3 nginx反向代理配置4、后端通过Dockerfile打包成docker镜像…

目标检测-锚框

目标检测算法通常会在输入图像中采样大量的区域&#xff0c;然后判断这些区域中是否包含我们感兴趣的目标&#xff0c;并调整区域边界从而更准确地预测目标的真实边界框&#xff08;ground-truth bounding box&#xff09;。 不同的模型使用的区域采样方法可能不同。 这里我们介…

vue3 antd项目实战——Form表单的重置【使用resetFields()重置form表单数据、清空输入框】

vue3 ant design vue项目实战——Form表单【resetFields重置form表单数据】关于form表单的文章场景复现resetFields()重置表单数据项目实战关于form表单的文章 文章内容文章链接Form表单提交和校验https://blog.csdn.net/XSL_HR/article/details/128495087?spm1001.2014.3001…

十二、Kubernetes核心技术Service详解、实例

1、概述 我们都知道Kubernetes会为每个pod分配一个独立的IP&#xff0c;然而却存在如下问题&#xff1a; Deployment控制的3个pod&#xff0c;其中一个Pod出现问题&#xff0c;这个时候给销毁重新创建后Pod Ip会变化Pod IP 仅仅是集群内可见的虚拟IP&#xff0c;外部无法访问 …

AcWing的Linux基础课学习笔记(未学完)

目录版本B站试听课&#xff08;1.常用文件管理命令&#xff09;1.1文件系统1.2文件管理常用指令版本 服务器&#xff1a;Linux Ubuntu 20.04     我的笔记本&#xff1a;Acer Nitro AN515-55&#xff08;所以如果我要在AC Terminal里复制粘贴的话分别是&#xff1a;CtrlFnI…

autoload魔术方法的妙用

前言&#xff1a; __autoload魔术方法从PHP7.2.0开始被废弃&#xff0c;并且在PHP8.0.0以上的版本完全废除。取而代之的则是spl_autoload_register&#xff0c;但是本文还是研究__autoload。 什么是autoload魔术方法&#xff1f; 首先还是从官方手册中下手&#xff0c;了解a…