HashMap内存泄漏

Java 中发生内存泄漏 5 个场景以及解决方法 前言 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和 Java 联系起来。在 Java 中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM 来处理。顾名思义,垃圾回收就是释放垃圾占用的空间,但垃圾回收器并不是万能的,它能够处理大部分场景下的内存清理、内存泄露以及内存优化。但它也并不是万能的,不然我们在项目实践过程中也不会出现那么多的内存泄漏的问题,很多的内存泄漏都是因为开发人员操作不当导致的。 本篇文章我们就来聊聊内存泄露的原因是什么,以及如何在 阅读详情

HashMap内存泄漏


在看ThreadLocal源码的时候,其中内部类ThreadLocalMap的存储数据结构的内部类Entry继承了WeakReferenc,为了能够搞清楚这个ThreadLocal,就只能先学习一下WeakReferenc了。在了解了WeakReferenc之后,又想到能不能使用强引用呢?,好吧又学习了一波在Map中使用强引用的弊端。(好吧,有时候为了学习一个东西,不得不又去了解其他的一下内容,好家伙简直俄罗斯套娃)

言归正传,下面就来了解一下HashMap存在内存泄漏的原因。直接上代码

public class TestJava {
    public static void main(String[] args) {
        Map<MyClass, String> map = new HashMap<MyClass, String>();
        MyClass my1 = new MyClass();
        MyClass my2 = new MyClass();

        map.put(my1, "my1");
        map.put(my2, "my2");

        my1 = null;
        System.gc();
        System.out.println("第1步" + map);

        my2 = null;
        System.gc();
        System.out.println("第2步" + map);

        map.clear();
        System.gc();
        System.out.println("第3步" + map);
    }
}

class MyClass {
    private String msg = super.toString() + " 对象还在呢";

    @Override
    public String toString() {
        return msg;
    }

    @Override
    protected void finalize() throws Throwable {
        System.out.println(super.toString() + " 对象被释放了");
    }
}

运行结果如下:
在这里插入图片描述
果然,在my1和my2设置null之后GC没有回收这两个垃圾,这个跟Java中的HashMap默认是强引用是有关的
在这里插入图片描述
原因:其实HashMap存进去的是my1跟my2指向的地址(堆内存中两条红色的线)作为key,但进行my1=null,my2=null的时候,本来按照常理来说,Java回收机制会对那些没有引用的堆内存对象进行回收,但不幸的是,HashMap依旧会强引用着my1跟my2的堆内存对象,导致GC无法对其进行回收。

WeakHashMap源码分析与ThreadLocal的内存泄漏 WeakHashMap和ThreadLocal的异同,两者分别怎样清理失效的Entry。ThreadLocal内存泄漏相关分析 阅读详情

相关推荐

SpringBoot 因未重写hashCode和equals方法导致的HashMap的内存泄漏问题

(2)只重写了hashCode没重写equals,则new出来的两个key对应的类的对象即便属性完全相同,也会被HashMap的put方法判定为两个不同的元素(同一个索引位置上的链表上的两个不同的元素),从而走到//(2),被作为新元素,都添加到HashMap中,而非更新key对应的value值。(3)重写了hashCode和equals,则new出来的两个key对应的类的对象如何属性完全相同,则会被HashMap的put方法判定为一个相同的元素,会走到//(3),更新key对应的value值。

专注基础架构领域 501

HashMap为什么会出现内存泄漏问题 以及 Java中引用类型的存储位置

HashMap中存在内存泄漏?Java的引用为什么有一部分在堆中?这到底是人性的扭曲还是道德的沦丧?欢迎观看此博客,了解java内存管理背后你不知道的故事。

MemoForward的博客 3584

MAT排查内存泄漏:为什么Path to GC Roots出来一大堆无关内容?HashMap堆分析终极避坑指南

1. Histogram的HashMap是全量对象聚合,直接查GC Roots会汇总所有实例路径,噪音巨大、数据重复,绝对不能用来判断泄漏;2. 排查泄漏必须过滤弱/软/虚引用,只看强引用链;3. 优先用 Dominator Tree 看全局支配关系,或单个大对象溯源,精准定位静态缓存、ThreadLocal、线程持有导致的泄漏;4. 线程栈临时对象是正常现象,只有长期持有不释放的强引用才是内存泄漏。

七叔的博客 62

HashMap如何避免内存泄露问题

HashMap如何避免内存泄露问题

Knight 1151

国税局发票查验中英文验证码识别最新版,识别率99.9%

采用深度学习进行发票查验验证码模型的训练,在我电脑上模型训练的环境如下: 显卡:RTX 2080TI tensorflow-gpu:2.5.3 1 训练集和测试集的准备 发票查验的验证码分为4种类型,分别为黑色、红色、黄色、蓝色,经过我的测试,采用4个模型的效果最好,每个模型对应识别一种类型的验证码。 首先我们4种类型的验证码都准备10万张。 00黑色类型的验证码: 01红色类型的验证码: 02黄色类型的验证码: 03蓝色类型的验证码: 验证码图像图像准备好后,对其进行标记,也就是对验证码重命名:

Keras深度学习 83万+

【rk3566/3568】Android 11移植gms

【rk3566/3568】Android 11移植gms 1、前言 测试功能时,想去Google play store去下个应用测试,发现通过网页搜索总是下载不到正确的谷歌服务框架;于是就不得不去搞一个内置的gms。 2、移植 1、需要下载Android 11对应的gms的包 opengapps 2、看下文件目录 直接移植core里面的文件,GAPPs Optional按需添加 3、在vendor下创建google目录 ...

lin_ff的博客 7645

[JAVA]第二篇(内存管理,HashMap内存泄漏解决办法)

内存管理,HashMap内存泄漏解决办法

让勤奋成为习惯 3万+

【2022KaliLinux】openvas/gvm 没有scan configs 或者是 scan config error “XXXXXXXXXXX”

gvm/openvas的configuration的scan config为空

zbossz的学习小分队 3605

WeakHashMap内存泄漏?HashMap呢?

文章目录前言Java中的四种引用HashMap内存泄漏场景第一种:内存泄漏代码第二种:内存泄漏代码小总结 前言 众所周知,WeakHashMap中的key是弱引用,如果再使用之后没有及时remove掉这个key,那么当GC时key就可能会被回收,导致key对应的value对象占用的内存无法回收进而导致内存泄漏,如果有大量的key可能会导致内存溢出、频繁FullGC等问题。 说了这么多导致内存泄漏是因为WeakHashMap的key是弱引用从而导致内存泄漏,但是HashMap的key是强引用,也会导致内存泄漏

第一行代码 2932

Unity类银河战士恶魔城学习总结(P162 Improve skeleton提升敌人的效果)

为敌人添加了快慢刀

suzh1qian的博客 572

保姆级教程:从AD导出Gerber到HFSS 3D Layout导入,搞定PCB电磁仿真全流程

本文提供从Altium Designer导出Gerber文件到Ansys HFSS 3D Layout导入的完整PCB电磁仿真流程指南。详细讲解Gerber文件导出设置、HFSS中的3D模型重建技巧,以及电磁仿真中的常见问题解决方案,帮助工程师高效完成高速电路和射频设计的性能验证。

weixin_30379531的博客 705

hashmap 不释放空间_【Java实践】HashMap使用不当导致内存泄漏问题

0. 背景HashMap 是 Java中非常常用的一个集合类,它是一个Map接口的数据结构的实现。它的性能很好,查询对象只需要O(1)时间复杂度。尽管HashMap使用非常方便,但是如果使用不当,可能会导致内存泄漏的。以下章节将介绍 HashMap可能导致内存泄漏的情况,以及如何解决该问题。1. HashMap 的存储首先,我们先明确HashMap的内部是如何存储数据的。HashMap是一个用于存...

weixin_39873325的博客 1999

ST7789驱动实战:从SPI时序到RGB565显示的完整配置解析

本文详细解析了ST7789液晶驱动芯片的SPI时序配置与RGB565显示实现,从数据手册解读到代码实战,涵盖SPI接口配置、关键寄存器设置及完整初始化流程。通过优化DMA传输和常见问题排查,帮助开发者高效驱动ST7789显示屏,适用于嵌入式显示项目开发。

weixin_29162439的博客 183

HashMap内存泄漏场景

根据论坛讨论总结,以下代码会出现内存泄漏 import java.util.HashMap; import java.util.Map; public class HashMapOver { public static void main(String[] args) { Map map = new HashMap();

chris的专栏 7422

基于CNN对抗嵌入的图像隐写——CNN-Based Adversarial Embedding for Image Steganography

CNN-Based Adversarial Embedding for Image Steganography https://ieeexplore.ieee.org/abstract/document/8603808 这篇论文发表在TIFS( IEEE TRANSACTIONS ON INFORMATION FORENSICS AND SECURITY),TIFS是网络与信息安全领域的国际两大顶级期刊之一,中国计算机学会(CCF)推荐的A类期刊,SCI一区TOP期刊,目前影响因子有7多了。 1 概

weixin_48654804的博客 2278

Android BLE扫描指南:解决设备发现问题

假设你正在开发一个MAUI应用,用于扫描并连接到BLE设备。你的代码在Windows上运行得很好,但在Android上却无法发现任何设备。尽管你已经在中声明了必要的权限,并且在运行时请求这些权限,扫描还是无法工作。

m0_62153576的博客 224

hashmap怎么取值_【Java实践】HashMap使用不当导致内存泄漏问题

0. 背景HashMap 是 Java中非常常用的一个集合类,它是一个Map接口的数据结构的实现。它的性能很好,查询对象只需要O(1)时间复杂度。尽管HashMap使用非常方便,但是如果使用不当,可能会导致内存泄漏的。以下章节将介绍 HashMap可能导致内存泄漏的情况,以及如何解决该问题。1. HashMap 的存储首先,我们先明确HashMap的内部是如何存储数据的。HashMap是一个用于存...

weixin_39568233的博客 640

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java map泄漏_【Java实践】HashMap使用不当导致内存泄漏问题

0. 背景HashMap 是 Java中非常常用的一个集合类,它是一个Map接口的数据结构的实现。它的性能很好,查询对象只需要O(1)时间复杂度。尽管HashMap使用非常方便,但是如果使用不当,可能会导致内存泄漏的。以下章节将介绍 HashMap可能导致内存泄漏的情况,以及如何解决该问题。1. HashMap 的存储首先,我们先明确HashMap的内部是如何存储数据的。HashMap是一个用于存...

weixin_39826984的博客 1528

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

使用HashMap在什么情况会出现内存泄漏?

Q:在Java中怎么可以产生内存泄露? A:Java中,造成内存泄露的原因有很多种。典型的例子是一个没有实现hasCode和equals方法的Key类在HashMap中保存的情况。最后会生成很多重复的对象。所有的内存泄露最后都会抛出OutOfMemoryError异常,下面通过一段简短的通过无限循环模拟内存泄露的例子说明一下。 package com.test; import java.util...

riemann_的博客 1万+

java HashMap 内存泄漏

import java.util.HashMap; import java.util.Map; public class HashMapOver { public static void main(String[] args) { Map<Person, Integer> map = new HashMap<Person, Intege...

weixin_30335353的博客 470

JDBC4Connection中的hashmap不释放,导致OutOfMemory内存泄漏

JDBC4Connection中的hashmap不释放,导致OutOfMemory内存泄漏 背景: 右边一位同学每天跑批的一个分润任务出现了OutOfMemory内存泄漏,和小伙伴一起查找问题,一直也没有定位问题。 任务描述: 多线程操作一批数据,每批次10个线程,每个线程处理1W数据。处理大概5W左右会出现OutOfMemory内存泄漏。 定位问题: 一开以为有大量对象没有释放,所以手动进行释放处理。测试重跑任务,只是有一点点效果,问题依旧还在。 怀疑数据库配置问题,检查了mysql所有主从

一路向南的博客 1167

HashMap扩容、红黑树转换条件(8和6的阈值) 以及 ThreadLocal内存泄漏案例

HashMap扩容、红黑树转换条件(8和6的阈值) 以及 ThreadLocal内存泄漏案例

weixin_43999182的博客 1101

Java内存泄漏排查:HashMap频繁使用导致的OOM问题

作为一名普通的Java开发者,日常开发中经常遇到一些看似简单但实际排查起来非常耗时的问题。这次我遇到了一个比较典型的内存泄漏问题,最终定位到是因为对HashMap的不正确使用导致的OutOfMemoryError(OOM)。这个问题虽然不是特别复杂,但在高并发、大数据量的场景下,它会严重影响系统性能和稳定性。这篇文章将详细记录整个排查过程,包括现象描述、分析思路、代码调试和最终的解决方案。这次内存泄漏问题虽然看起来简单,但在实际开发中却是很常见的陷阱。

CatchLight的博客 460

面试干货3——基于JDK1.8的HashMap(与Hashtable的区别、数据结构、内存泄漏..)

HashMap一、HashMap基本知识1. 简述2. 继承关系3. 基本属性4. 遍历二、HashMap与HashTabl的区别1. 继承结构2. 对待null3. 线程安全性4. 初始容量与扩容5. 计算hash的方法三、HashMap数据存储结构1. JDK1.8之前2. JDK1.8时3. put方法剖析四、结语 一、HashMap基本知识 1. 简述         HashMap基于Map接口实现,元素以键值对的方

qq_41563912的博客 3153

hashmap(理解原理!值钱!!!!)环链,内存泄漏(11.27)

import java.util.HashMap; public class HashMaps { public static void main(String[] args) { // TODO Auto-generated method stub // 数据对 保存 数据两两成对, key-value值 kv键值对 // key的作用是 识别该数据的唯一性 // value...

weixin_45392911的博客 633
上一篇: Spring学习笔记第四天,Spring中的JDBCTemplate、Spring基于AOP的事务控制、Spring中的事务控制
下一篇: 两万字讲清楚ThreadLocal
Code_Boy_Code
博客等级 码龄9年 650粉丝 28原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值