- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
据我了解,HashMap 不应该被垃圾回收,而 WeakHashMap 应该被垃圾回收,但是当我运行这段代码时,hashmap 和 weakhashmap 都被垃圾回收。
import java.util.HashMap;
import java.util.WeakHashMap;
public class WeakHashMapDemo {
public static void main(String[] args) {
HashMap<String,Temp> hashMap= new HashMap<>();
hashMap.put("a", new Temp("hashmap"));
WeakHashMap<String,Temp> weakHashMap= new WeakHashMap<>();
weakHashMap.put("a", new Temp("identity hashmap"));
hashMap= null;
weakHashMap= null;
System.gc();
try {
Thread.sleep(5000);
}catch(InterruptedException interruptedException) {
interruptedException.printStackTrace();
}
System.out.println(hashMap);
System.out.println(weakHashMap);
}
}
class Temp {
String name;
Temp(String name) {
this.name= name;
}
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println(name+":: Finalize Method Executed");
}
@Override
public String toString() {
return this.name;
}
}
输出:
identity hashmap:: Finalize Method Executed
hashmap:: Finalize Method Executed
null
null
虽然仅使用 HashMap,但它不会被 GC 回收。
import java.util.HashMap;
import java.util.WeakHashMap;
public class WeakHashMapDemo {
public static void main(String[] args) {
HashMap<String,Temp> hashMap= new HashMap<>();
hashMap.put("a", new Temp("hashmap"));
System.gc();
try {
Thread.sleep(5000);
}catch(InterruptedException interruptedException) {
interruptedException.printStackTrace();
}
System.out.println(hashMap);
}
}
class Temp {
String name;
Temp(String name) {
this.name= name;
}
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println(name+":: Finalize Method Executed");
}
@Override
public String toString() {
return this.name;
}
}
输出:
{a=hashmap}
最佳答案
首先不要使用 finalize
- 它已被弃用,有更好的方法来清理你自己并且 SO 充满了这样的帖子(ReferenceQueue
和 SoftReferences
就是其中之一)。
然后不要使用内部缓存的对象作为 WeakHashMap
中的键(String
就是这样)。
最后一点是,这与WeakHashMap
无关,这是Objects的基本活力。在您的第一个示例中,您显式将引用设置为 null
,因此它们会被 GC 清除,而在您的第二个示例中则不会,并通过System.out.println(hashMap);
;因此它不会被收集。
关于java - HashMap 与 WeakHashMap 一起被垃圾收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52760002/
在下面的代码中,我创建了一个 Pen 对象并将其颜色初始化为白色。在 Pen 的构造函数中,将字段“penColor”设置为传递给构造函数的值后,我更新了一个全局静态弱 HashMap ,其中 KEY
我正在运行一个游戏,当我启动时,我将图像加载到图像的 WeakHashMap 中。当我运行游戏时,我的 RAM 不断增加,最终我的 WeakHashMap 只是卸载所有数据。这与垃圾收集有关吗?有什么
是否存在所有值都是弱引用的 Map 类?类似于 WeakHashMap,但用于值而不是键。 提前致谢... 最佳答案 您可以使用 MapMaker这是 Guava 的一部分。 "Java DOC:A
我正在阅读有关 WeakHashMap 的 Java 文档我得到了基本概念。由于 GC 线程在后台运行,您可能会出现“异常行为”,例如迭代时出现 ConcurrentModificationExcep
我试图弄清楚 WeakHashMap 在垃圾收集后如何清理。正如你们中许多人可能知道的那样,当 WeakHashMap 条目的键被垃圾回收时,它会自动删除。但是,例如,如果我做这样的事情: List>
我想对将在内存中短时间存在的对象使用 WeakHashMap。 每个对象都有一个 id(唯一的整数字段,它是来自数据库的主键),所以我的第一个想法是使用该字段作为对象的键。 但是,Integer 是不
我正在寻找与 等价的 WeakHashMap 类,除了它把多个键映射到一个值,所以真的更像 WeakHashMap WeakHashMap etc. get 和 set 条目的方式类似于数据库中的多列
这个问题在这里已经有了答案: When would you use a WeakHashMap or a WeakReference? (10 个答案) 关闭 7 年前。 至于 weakhashma
Javadocs 说“当一个键被丢弃时,它的条目被有效地从 map 中移除”。 但除非有另一个线程偶尔会删除这样的 Map.Entry条目,值对象不会被 map 强引用吗?但是因为没有这样的线程在运行
我同时使用了 WeakHashMap。我想基于一个 Integer 参数实现细粒度的锁定;如果线程 A 需要修改由 Integer a 标识的资源,而线程 B 需要修改由 Integer b 标识的资
今天我找到了this blog post其中讨论了 WeakHashMap 在缓存上的用法。有趣的是,不是值,而是键被存储为弱引用,当引用不再存在时,整个键值对将从 WeakHashMap 中删除。因
我想测试 Java WeakHashMap 类的功能,为此我编写了以下测试: public class WeakHashMapTest { public static void main(String
如果没有对其中一个键的 Activity 引用,我如何模拟 WeakHashMap 中条目的删除。我有下一个代码: WeakHashMap weakMap = new WeakHashMap(); I
我正在使用 WeaekHashMap 来实现缓存。我想知道如果我正在遍历这个映射的键,同时垃圾收集器正在主动从这个映射中删除键,我会收到一个 ConcurrentModificationExcepti
是HashSet> Set相当于WeakHashMap ?也就是说,当条目不再被引用时,它们会自动删除吗? 如果不是,等价的是什么? 最佳答案 不,如果集合中的 WeakReference 之一引用的
有一个 WeakHashMap 实例初始化了,例如,500 个条目。现在,它的 key 在运行的应用程序中的任何地方都没有被引用一天左右。这张 map 的条目会在一定时间后自动删除吗? 我的理解是,如
如何自动清除instanceMap的key和value;当 getInstance() API 返回的 Conf 对象是使用 WeakHashMap 和 WeakReference 进行垃圾收集时
首先我想澄清一下我对WeakReference的理解因为以下问题取决于相同。 static void test() { Person p = new Person(); WeakRef
所以我有一个从 ORM/Hibernate 相互引用的对象链 大陆 有很多国家 有很多状态 有很多城市 有很多城市 国家 有一个国家 有很多状态 有很多城市 有很多城市 状态 拥有一个大陆 有一个国家
我有一个这样的代码。 private static Map PATTERNS; private static Map patterns() { if (PATTERNS == null) {
我是一名优秀的程序员,十分优秀!