首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JVM中对象的回收过程

如果有一个值,对应的键已经不再 使用了, 将会出现什么情况呢? 假定对某个键的最后一次引用已经消亡,不再有任何途径引 用这个值的对象了。...但是,由于在程序中的任何部分没有再出现这个键,所以,这个键 / 值 对无法从映射中删除。为什么垃圾回收器不能够删除它呢? 难道删除无用的对象不是垃圾回 收器的工作吗?...或者使用 WeakHashMap完成这件事情。当对键的唯一引用来自散列条目时, 这一数据结构将与垃圾回收器协同工作一起删除键 / 值对。 下面是这种机制的内部运行情况。...除了WeakHashMap使用了弱引用,ThreadLocal类中也是用了弱引用,可以自行了解下。...虚拟机可以对满足上述3个条件的无用类进行回收,这里说的仅仅是“可以”,而不是和对象一样,不使用了就必然会回收。

54620

滚雪球学Java(65-2):弱引用,强实现:探索Java的WeakHashMap

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8 前言   在Java开发中,有时我们需要保存大量的对象,但是这些对象又不是一直都需要被内存中持有,比如一些缓存数据或者对象池中的对象等...为了实现这个功能,它内部使用了一个 HashMap 和一个队列。队列中存储了已经被垃圾回收的键的弱引用,每次操作时都会先清理队列中已经被回收的键值对。   ...put public V put(K key, V value) 将指定键映射到此映射中的指定值。键和值都可以为null。返回value。...总结   在此,我们来做个小小的总结,本文深入探讨了Java中的WeakHashMap,这是一种特殊的HashMap实现,它使用弱引用作为键,允许在内存不足时自动回收不再被引用的键值对。...文章还提供了WeakHashMap的几个典型应用场景,如缓存实现、对象关联和事件监听,并分析了使用WeakHashMap的优点,例如内存管理的高效性和自动维护的特性,同时也指出了它的性能和易误用性等缺点

8710
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    译文:理解Java中的弱引用

    解决上述的widget序列数记录的问题,最简单的办法就是使用Java内置的WeakHashMap类。WeakHashMap和HashMap几乎一样,唯一的区别就是它的键(不是值!!!)...当WeakHashMap的键标记为垃圾的时候,这个键对应的条目就会自动被移除。这就避免了上面不需要的Widget对象手动删除的问题。...其get方法一直返回null就是为了阻止其指向的几乎被销毁的对象重新复活。 虚引用使用场景主要由两个。它允许你知道具体何时其引用的对象从内存中移除。而实际上这是Java中唯一的方式。...使用虚引用,上述情况将引刃而解,当一个虚引用加入到引用队列时,你绝对没有办法得到一个销毁了的对象。因为这时候,对象已经从内存中销毁了。...总结 我想看到这里,很多人开始发牢骚了,为什么你要讲一个过去十年的老古董API呢,好吧,以我的经验看,很多的Java程序员并不是很了解这个知识,我认为有一些深入的理解是很必要的,同时我希望大家能从本文中收获一些东西

    76720

    WeakHashMap的原理

    简介 WeakHashMap和HashMap一样,WeakHashMap也是一个散列表,它存储的内容也是键值对(key-value)映射,而且键和值都可以为null。...因此,WeakHashMap使用了弱引用作为内部数据的存储方案,,WeakHashMap可以作为简单缓存表的解决方案,当系统内存不足时,垃圾收集器会自动的清除没有在任何其他地方被引用的键值对。...在WeakHashMap实现中,借用了ReferenceQueue这个“监听器”来保存被GC回收的”弱键”,然后在每次使用WeakHashMap时,就在WeakHashMap中删除ReferenceQueue...Java引用Reference学习 WeakHashMap是通过数组table保存Entry(键值对);每个Entry实际上就是一个链表来实现的。...当下一步我们需要操作WeakHashMap时,会先同步table、queue,table中保存了全部的键值对,而queue中保存的是GC回收的键值对;同步他们,就是删除table中被GC回收的键值对。

    24920

    Java WeakHashMap的深度解析:如何利用弱引用实现弱缓存策略?

    WeakHashMapJava中的WeakHashMap类是一种基于弱引用实现的Map集合。它的特点是:当Map中的某个键值对的键不再被强引用指向时,该键值对就会被自动清除。...当一个缓存项中的键不再被强引用指向时,该缓存项就会被自动清除。当某个键对应的值已经被清除时,我们就需要重新创建这个值,并将其放入缓存中。3....使用弱缓存策略时,我们需要注意以下几点:缓存中的键只能是弱引用对象,值可以是强引用对象。当缓存中的键被垃圾回收器回收时,该键对应的值也会被自动清除。...当从缓存中获取某个键对应的值时,如果该值已经被清除,就需要重新创建该值,并将其放入缓存中。4....小结在本文中,我们深入研究了Java中利用WeakHashMap实现弱缓存策略的原理和方法。我们首先介绍了弱引用的概念,然后讲解了WeakHashMap的实现原理和使用方式。

    64682

    WeakHashMap,源码解读

    而value值则赋予了强引用,但这并不影响,我们在稍后会介绍一个WeakHashMap.expungeStaleEntries方法,该方法会把弱键对应的key-value整个赋为null,以帮助GC将其回收...的源码中我们看到,weak keys的值会被保存到引用队列中,该方法就说将引用队列中保存的弱键对应的Entry从单链表中删除,即删除哈希表中被GC回收了的键值对。...如果你正好要实现这样的缓存:只要在缓存之外存在对某个项的键的引用,该项就有意义,那么就可以用WeakHashMap代表缓存。...当缓存中的项过期之后,它们就会自动被删除(要注意的是,只有当所要的缓存项的生命周期是由该键的外部引用而不是由值决定时,WeakHashMap才有用处)。...Tomcat就用WeakHashMap实现了它的并发缓存ConcurrentCache,源码如下: package org.apache.tomcat.util.collections; import

    39710

    Java集合类型详解

    这个方法集合了Java 5的自动装箱和无参变量的特性,来实现将一个变量快速地传给 Arrays.hashcode方法——只是传值进去,不是对象。...IdentityHashMap:这是一个特殊的Map版本,它违背了一般Map的规则:它使用 “==” 来比较引用而不是调用Object.equals来判断相等。...这就是为什么迭代LinkedHashMap的条目(entry)、键和值的时候总是遵循插入的顺序。在JDK中,这是每元素消耗内存最大的集合。 TreeMap:一种基于已排序且带导向信息Map的红黑树。...WeakHashMap:这种Map通常用在数据缓存中。它将键存储在WeakReference中,就是说,如果没有强引用指向键对象的话,这些键就可以被垃圾回收线程回收。值被保存在强引用中。...多数的并发集合是在Java 1.5引入的。

    76320

    【Java入门提高篇】Day34 Java容器类详解(十五)WeakHashMap详解

    源码详解系列均基于JDK8进行解析 说明 在Java容器详解系列文章的最后,介绍一个相对特殊的成员:WeakHashMap,从名字可以看出它是一个 Map。...WeakHashMap探秘 从说明可以看出,WeakHashMap的特殊之处便在于它的Entry与众不同,里面的Entry会被垃圾回收器自动回收,那么问题来了,为什么会被自动回收呢?...存储结构 WeakHashMap中的数据结构是数组+链表的形式,这一点跟HashMap也是一致的,但不同的是,在JDK8中,当发生较多key冲突的时候,HashMap中会由链表转为红黑树,而WeakHashMap...别着急,看看构造函数就可以发现,它调用了父类的构造函数。...这样设计的好处是,能将相对常用的对象都能在eden缓存中找到,不常用的则存入longterm缓存,并且由于WeakHashMap能自动清除Entry,所以不用担心longterm中键值对过多而导致OOM

    50940

    Java引用类型具体解释

    JVM  垃圾收集对不同类型的引用的有一种不同的方法。java对于它的对象。仅仅存在有引。它会一直存在于内存中。假设越来越多这样的对象,外JVM的内存量。JVM抛出OutOfMemory错。...哈希表的接口同意使用不论什么Java对象作为键来使用。当一个键值对被放入到哈希表中之后。哈希表  对象本身就有了对这些键和值对象的引用。...假设这样的引用是强引用的话,那么仅仅要哈希表对象本身还存活,当中所包括的键和值对象是不会被回收的。假设某个存活  时间非常长的哈希表中包括的键值对非常多,终于就有可能消耗掉JVM中所有的内存。...对于这样的情况的解决的方法就是使用弱引用来引用这些对象,这样哈希表中的键和值对象都能被垃圾回收。 Java中提供了 WeakHashMap来满足这一常见需求。...可是还须要对引用本身做一些的处理。典型的情景是在哈希表中。引用对象是作为WeakHashMap中的键对象的。当其引用的实际对象被垃圾回收之后。就须要把该键值对从哈希表中删除。

    31120

    WeakHashMap,源码解读

    而value值则赋予了强引用,但这并不影响,我们在稍后会介绍一个WeakHashMap.expungeStaleEntries方法,该方法会把弱键对应的key-value整个赋为null,以帮助GC将其回收...的源码中我们看到,weak keys的值会被保存到引用队列中,该方法就说将引用队列中保存的弱键对应的Entry从单链表中删除,即删除哈希表中被GC回收了的键值对。...如果你正好要实现这样的缓存:只要在缓存之外存在对某个项的键的引用,该项就有意义,那么就可以用WeakHashMap代表缓存。...当缓存中的项过期之后,它们就会自动被删除(要注意的是,只有当所要的缓存项的生命周期是由该键的外部引用而不是由值决定时,WeakHashMap才有用处)。...Tomcat就用WeakHashMap实现了它的并发缓存ConcurrentCache,源码如下: package org.apache.tomcat.util.collections; import

    92430

    Java的WeakHashMap:理解弱引用与垃圾回收

    Java的WeakHashMap:理解弱引用与垃圾回收 摘要 Java的WeakHashMap是一种特殊的Map实现,它使用弱引用来存储键,使得在适当时机垃圾回收可以自动移除键值对。...本文将介绍WeakHashMap的原理和用途,并结合代码示例演示如何在Java中利用WeakHashMap实现自动资源管理和缓存清理。 1....然而,有些场景下我们需要在不再使用某个键时,自动将其从Map中移除,而不是手动调用remove()方法。这就是WeakHashMap的用武之地。...WeakHashMap的原理 WeakHashMap是java.util包下的一个特殊Map实现,它的键(key)是使用弱引用(WeakReference)来存储的。...这意味着,如果某个键只有WeakHashMap中的弱引用在引用它,而没有其他强引用指向它,那么在垃圾回收器执行回收时,该键值对会被自动移除,从而节省内存空间。 3.

    64630

    Java集合总览

    这个方法集合了Java 5的自动装箱和无参变量的特性,来实现将一个变量快速地传给 Arrays.hashcode方法——只是传值进去,不是对象。...IdentityHashMap:这是一个特殊的Map版本,它违背了一般Map的规则:它使用 “==” 来比较引用而不是调用Object.equals来判断相等。...这就是为什么迭代LinkedHashMap的条目(entry)、键和值的时候总是遵循插入的顺序。在JDK中,这是每元素消耗内存最大的集合。 TreeMap:一种基于已排序且带导向信息Map的红黑树。...WeakHashMap:这种Map通常用在数据缓存中。它将键存储在WeakReference中,就是说,如果没有强引用指向键对象的话,这些键就可以被垃圾回收线程回收。值被保存在强引用中。...多数的并发集合是在Java 1.5引入的。

    1.1K70

    WeakHashMap理解

    二、为什么需要WeakHashMap WeakHashMap正是由于使用的是弱引用,因此它的对象可能被随时回收。...更直观的说,当使用 WeakHashMap 时,即使没有删除任何元素,它的尺寸、get方法也可能不一样。比如: (1)调用两次size()方法返回不同的值;第一次为10,第二次就为8了。...:Entry通过传入key和queue调用了父类WeakReference的构造函数,那么key就成为了这个弱引用所引用的对象,并把这个弱引用注册到了引用队列上。...3、而static的就不在gc之列,所以key也就不会被gc,所以它的大值value,也就不会被设为null,不会被回收。...只有通过remove方法才能删除null键所关联的value,建议在使用WeakHashMap的时候尽量避免使用null作为键。

    50020

    一文读懂《Effective Java》第6条:消除GC触及不到的过期对象引用

    数组(对象引用单元,而不是对象本身)的元素。...解决方法:使用 WeakHashMap 代表缓存,当缓存过期后会被自动删除。参考《弱引用是什么》 在Java集合中有一种特殊的Map类型:WeakHashMap。...和HashMap一样,WeakHashMap 也是一个散列表,它存储的内容也是键值对(key-value)映射,而且键和值都可以是null。...不过WeakHashMap的键是“弱键”,里面存放了键对象的弱引用,当某个键不再正常使用时,会从WeakHashMap中被自动移除。当一个键对象被垃圾回收,那么相应的值对象的引用会从Map中删除。...解决方法:同样将它们的服务调用对象保存为弱引用(weak reference),例如 WeakHashMap 的键。 总结 上文总结了3种常见的Java 内存泄露场景和对应的解决办法。

    31510

    易犯的Java内存泄漏代码

    而不是将基本数据类型用于求和,我采用了Long(包装类),这是内存泄漏的原因。由于自动装箱,sum = sum + l;在每次迭代中创建一个新对象,因此将创建1000个不必要的对象。...请避免在基本数据类型和包装类之间进行混合使用。 尽可能地使用基本的数据类型。 示例2:使用缓存 ? 在这里,由于内部map数据结构而发生内存泄漏。此类用于显示缓存中的员工值。...关于WeakHashMap需要谨慎的使用,如果要重新使用存储在缓存中的值,可能是它的key不被任何其他对象引用,因此该条目将被GC回收并且该值奇迹般地消失了。 示例3:关闭连接 ?...在CustomKey中,我们忘记提供equals()和hashcode()实现,因此映射get()方法检查hashcode()和equals()时,不能再检索存储在map中的键和值。...但是这个条目不能被GC回收,因为map引用了它,但应用程序无法访问它。绝对是内存泄漏。 所以当你做自定义key时,总是提供一个equals和hashcode()的实现。

    1.7K70

    java weakhashmap_解析WeakHashMap与HashMap的区别详解

    总结来说:WeakHashMap并不是你啥也干他就能自动释放内部不用的对象的,而是在你访问它的内容的时候释放内部不用的对象 问题讲清楚了,现在我们来梳理一下.了解清楚其中的奥秘....丢弃某个键时,其条目从映射中有效地移除,因此,该类的行为与其他的 Map 实现有所不同。 null 值和 null 键都被支持。...,而 remove 方法返回 false, 对于键集、值集、项集进行的检查,生成的元素数量越来越少。...因此,面对并发的修改,迭代器很快就完全失败, 而不是冒着在将来不确定的时间任意发生不确定行为的风险。...因此,编写依赖于此异常程序的方式是错误的, 正确做法是:迭代器的快速失败行为应该仅用于检测 bug。注意1:null 值和 null 键都被支持。 注意2:不是线程安全的。

    63810

    Java WeakHashMap

    从类定义上来看,它和普通的HashMap一样,继承了AbstractMap类和实现了Map接口,也就是说它有着与HashMap差不多的功能。...那么既然jdk已经提供了HashMap,为什么还要再提供一个WeakHashMap呢? 黑格尔曾经说过,存在必合理,接下来我们来看下为什么有WeakHashMap。   ...没错WeakHashMap就是能实现这种功能的东西,这也是它和普通的HashMap不同的地方——它有自清理的机制。   如果让你实现一种自清理的HashMap,你怎么做?...1.阿里Arthas   在阿里开源的Java诊断工具中使用了WeakHashMap做类-字节码的缓存。...3.ThreadLocalMap   ThreadLocal中用ThreadLocalMap存储Thread对象,虽然ThreadLocalMap和WeakHashMap不是一个东西,但ThreadLocalMap

    66320

    对象的强, 软, 弱和虚引用

    在别人的源码中看到对SoftReference的使用,不是很了解,在网上搜到一篇很好的文章,优化了排版,分享之 本文介绍对象的强、软、弱和虚引用的概念、应用及其在UML中的表示。...在这两条路径之间取最强的引用,于是对象5是一个软可及对象。 3.使用软引用构建敏感数据的缓存 3.1 为什么需要使用软引用 首先,我们看一个雇员信息查询系统的实例。...4.2如何使用WeakHashMap 在Java集合中有一种特殊的Map类型—WeakHashMap,在这种Map中存放了键对象的弱引用,当一个键对象被垃圾回收器回收时,那么相应的值对象的引用会从Map...当映射的生命周期必须与键的生命周期联系在一起时,可以使用这种方法。用WeakHashMap修复 SocketManager。...用弱引用承载映射键,这使得应用程序不再使用键对象时它们可以被垃圾收集,get() 实现可以根据WeakReference.get() 是否返回 null 来区分死的映射和活的映射。

    68310

    杰哥教你面试之一百问系列:java集合

    HashMap和HashTable有什么区别?回答:– HashMap: 允许使用null键和null值,不是线程安全的(非同步),在大多数情况下性能较好。...回答:IdentityHashMap是一个特殊的Map实现,它在比较键和值的相等性时使用的是引用的身份(内存地址)而不是通过equals方法。这使得它可以区分不同引用指向的相同内容的情况。...– EnumMap: 也是java.util包中的一个专门为枚举类型设计的Map实现。它的键必须是同一个枚举类的枚举值,提供了非常高效的枚举键值对存储和查找操作。...回答:IdentityHashMap是java.util包中提供的一个实现Map接口的类,它使用引用的身份(内存地址)而不是equals方法来判断键的相等性。...回答:IdentityHashMap是java.util包中的一个实现了Map接口的类,与普通的HashMap不同,它使用引用的身份(内存地址)而不是equals方法来判断键的相等性。

    26050
    领券