今天在看Java核心技术1的时候看到HashMap的对象,书中讲到: 
1.如果有一个值,对应的键不再使用他了,但由于key与value之间存在强引用,是不会被垃圾回收的 
2.垃圾回收器跟踪活动的对象,只要映射对象是活动的,其中的所有桶也是活动的,它们不能被回收 
所以做了下面的测试:

public class TestJava {public static void main(String[] args) {HashMap map = new HashMap();Test t1 = new Test();Test t2 = new Test();map.put(t1, "1");map.put(t2, "2");t1 = null;System.gc();System.out.println("第1步" + map);t2 = null;System.gc();System.out.println("第2步" + map);map.clear();System.gc();System.out.println("第3步" + map);}}class Test {private String strTest = "该Test对象还存在";@Overridepublic String toString() {return strTest;}@Overrideprotected void finalize() throws Throwable {// TODO Auto-generated method stubSystem.out.println("该Test对象被释放了");}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

测试结果: 
 
果然,GC不会回收这两个垃圾,这个跟Java中的HashMap默认是强引用有关的

分析: 

愿意:其实HashMap存进去的是t1跟t2指向的地址(堆内存中两条黑色的线)作为key,但进行t1=null,t2=null的时候,本来按照常理来说,Java回收机制会对那些没有引用的堆内存对象进行回收,但不幸的是,HashMap依旧会强引用着t1跟t2的堆内存对象,导致GC无法对其进行回收

下面讲更为深入的讲解HashMap: 
1.散列表的原理与实现 - 简书 
2.哈希表(散列表)原理详解 - 那年聪聪 - CSDN博客 
3.HashMap的存取之美 - gugege - 博客园 
4.理解LinkedHashMap - children - 博客园

HashMap与垃圾回收相关推荐

  1. JVM虚拟机(四):JVM 垃圾回收机制概念及其算法

    垃圾回收概念和其算法 谈到垃圾回收(Garbage Collection)GC,需要先澄清什么是垃圾,类比日常生活中的垃圾,我们会把他们丢入垃圾箱,然后倒掉.GC中的垃圾,特指存于内存中.不会再被使用 ...

  2. 【Android 内存优化】内存抖动 ( 垃圾回收算法总结 | 分代收集算法补充 | 内存抖动排查 | 内存抖动操作 | 集合选择 )

    文章目录 一. 垃圾回收算法总结 二. 分代收集算法补充 三. 查看 Java 虚拟机 四. 获取 Android 应用可使用最大内存 五. 内存抖动标志 六. 排查内存抖动 七. 常见的造成内存抖动 ...

  3. 浅谈JVM的实现与垃圾回收机制

    Java被称为是一个人类可读的编程语言,其主要特点是基于类和面向对象,Java的开源版本被称为OpenJDK.Java编程环境由两个部分组成:Java语言和运行环境,运行环境也称为Java虚拟机(JV ...

  4. java基础(一):谈谈java内存管理与垃圾回收机制

    看了很多java内存管理的文章或者博客,写的要么笼统,要么划分的不正确,且很多文章都千篇一律.例如部分地方将jvm笼统的分为堆.栈.程序计数器,这么分太过于笼统,无法清晰的阐述java的内存管理模型: ...

  5. 【深入理解JVM】JVM垃圾回收机制

    最近又回头翻了翻<java编程思想>.有关垃圾回收机制的问题还没有总结过,刚好今天周六,总结一下吧. 1.垃圾回收的目的 垃圾回收的目的是查找和回收(清理)无用的对象,以便让JVM更有效的 ...

  6. Java中的引用类型(强引用、弱引用)和垃圾回收

    Java中的引用类型和垃圾回收 强引用Strong References 强引用是最常见的引用: 比如: StringBuffer buffer = new StringBuffer(); 创建了一个 ...

  7. 深入理解 Java 垃圾回收机制

    转载自 http://www.cnblogs.com/andy-zcx/p/5522836.html 深入理解 Java 垃圾回收机制 一:垃圾回收机制的意义 java  语言中一个显著的特点就是引入 ...

  8. WeakHashMap垃圾回收原理

    介绍 WeakHashMap自然联想到的是HashMap.确实,WeakHashMap与HashMap一样是个散列表,存储内容也是键值对.与HashMap类似的功能就不展开了,本文重点关注在WeakH ...

  9. 深入理解java垃圾回收机制

    一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理.由于有个垃圾回收机制 ...

最新文章

  1. Java知识点总结(JavaIO- System类对IO的支持与Scanner类 )
  2. Python 小把戏之下载小说
  3. 2021-04-09 随机模拟—蒙特卡洛方法 Matlab代码实现
  4. 机器学习中的度量—— 向量距离
  5. ASP.NET Core 防止跨站请求伪造(XSRF\/CSRF)攻击
  6. PHP 常用代码大全
  7. checkbox 多选 mysql 搜索_mySQL技术的方方面面,不管是应用还是面试,看这一文就够了...
  8. 开发者必备英文网站合集
  9. Android 使用传感器
  10. IDEA快速生成测试用例类和完成单元测试
  11. 【软考网络工程师】华为路由器交换机配置
  12. Ps修改更换证件照背景色(底色颜色)
  13. UiAutomator2—By、BySelector
  14. ISP - bayer 是什么?
  15. 程序员的十个层次 你属于哪一层?
  16. java openoffic linux_CentOS 下安装 OpenOffice4.0
  17. 程序员裸辞三个月,终于拿到大厂offer!网友:不应该!
  18. ROS机器人高效编程(原书第3版)勘误、问题及资料汇总
  19. Jess在Eclipse中的安装
  20. solr4.4.0 集成 carrot2 支持中文和添加自己的中文分词器的方法。

热门文章

  1. decimal 类型数据怎么引用_Java基本数据类型和引用类型
  2. java 字节码增强原理_深入浅出Java探针技术1--基于java agent的字节码增强案例
  3. 封头名义厚度如何圆整_压力容器封头厚度计算
  4. mysql安装了老版本_Windows环境下MySQL安装教程
  5. 我和女实习生那些不想说的故事
  6. SQL语句的添加、删除、修改多种方法
  7. php禁止代理ip访问_php禁止某ip或ip地址段访问的方法(转载)
  8. linux 基础学,linux基础学习【1】
  9. python正则表达式匹配模式屠夫之桥_Python 编程快速上手 第 7章 模式匹配与正则表达式...
  10. html原生音频播放器倍速,HTML5倍数功能视频播放器(加速2倍,1.5倍播放)