gpt4 book ai didi

Java - 应用程序中使用的 HashMap 和 WeakHashMap 引用

转载 作者:行者123 更新时间:2023-12-02 01:10:53 29 4
gpt4 key购买 nike

只是想从GC的角度理解一些东西

public Set<Something> returnFromDb(String id) {
LookupService service = fromSomewhere();
Map<String,Object> where = new WeakHashMap<>() {}
where.put("id",id);
return service.doLookupByKVPair(where); // where doesn't need to be serializable
}

我的理解是,一旦这个方法调用离开堆栈,就没有对 where 的引用。无论使用HashMapWeakHashMap - 但是由于弱引用是弱可达的,GCd 不是更快吗?但如果方法调用离开堆栈,则无论如何都没有可访问的引用。

我想我真正的问题是 - “在这里使用WeakHashMap<>实际上很重要” - 我认为这是“不,因为影响微不足道” - 但第二个答案不会损害我的知识.

最佳答案

当您使用像 where.put("id",id); 这样的语句时,您会将一个值与从文字创建的 String 实例永久关联起来由包含它的代码引用。所以关联的弱语义是没有意义的,只要代码可达,这个特定的关键对象就永远不会被垃圾回收。

当整个 WeakHashMap 变得无法访问时,引用的弱性质不会像一般无法访问的对象那样对垃圾回收产生影响。正如 this answer 中所讨论的,垃圾回收性能主要取决于可达对象,而不是不可达对象。

记住the documentation :

The relationship between a registered reference object and its queue is one-sided. That is, a queue does not keep track of the references that are registered with it. If a registered reference becomes unreachable itself, then it will never be enqueued. It is the responsibility of the program using reference objects to ensure that the objects remain reachable for as long as the program is interested in their referents.

换句话说,WeakReference 在无法访问时没有任何影响,因为它将像任何其他垃圾一样被处理,即根本不被处理。

当垃圾收集正在进行时,如果您对 WeakHashMap 有强引用,则会降低性能,因为垃圾收集器必须跟踪遇到可到达的 WeakReference 实例,如果尚未遇到它们的引用并将其标记为强可达,则清除它们并将它们排入队列。这种额外的工作是您为允许较早收集键和随后的清理而必须付出的代价,这是删除强引用值所必需的。

如上所述,当像您的示例中那样, key 永远不会被垃圾收集时,这种额外的努力就被​​浪费了。但是,如果在使用 WeakHashMap 时没有发生垃圾回收,则不会有任何影响,如上所述,因为整个对象图的回收都会立即发生,无论垃圾中的对象类型如何.

关于Java - 应用程序中使用的 HashMap 和 WeakHashMap 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59305226/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com