问题标签 [weakhashmap]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
165 浏览

java - 以线程为键的Java Map,如WeakHashMap?

在图书馆中,我有一些ThreadLocal带有一些对象的变量。我想将所有这些对象累积在一个数据结构中,并能够在需要时对其进行迭代。另一方面,当应用场景包括数千个线程的创建和死亡时,我不希望这个数据结构被污染(此外,这可能会导致内存泄漏)。所以解决方案应该从对象中清除数据结构,从本地到死线程。

我认为解决方案应该类似于WeakHashMapwith WeakReference<Thread>in keys,它应该另外检查Thread在常规删除过程中是否不存在。迭代结束Map.values()

是否有这种数据结构的现有实现?还是有一些更好的解决方案可以解决我的问题?

0 投票
1 回答
519 浏览

java - 弱引用。对象只剩下 WeakReferences 时不会被移除

在我们的系统中,我们将客户端会话呈现为会话类。

从历史上看,此类的哈希码是可变的 - 它在创建时为 0,并在某个时间点更改为用户 ID。

系统中存在两个会话管理器。

  1. Client Sessions Manager - 保持活跃的客户端会话是客户端。这个管理器内部是简单的 ConcurrentHashMap< Long, Session >,其中键是用户 ID。
  2. 内存会话管理器 - 保存 GC 尚未收集的会话。里面有WeakHashMap<Session,Long>(这里的值是用户id)

当客户端连接并登录时,下一个流程发生:

  1. 客户端会话已创建。
  2. 会话放入内存会话管理器(此时哈希码为 0,因此它们被放入单个存储桶中)
  3. 客户端已登录并使用正确的哈希码将会话放入客户端会话管理器。
  4. 客户端会话已关闭并从客户端会话管理器中删除。

因此,在收集了 Session 对象上的所有强引用后,它必须从 WeakHashMap 中删除。(WeakHashMap 中的条目将在其键不再正常使用时自动删除。更准确地说,给定键的映射的存在不会阻止该键被垃圾收集器丢弃,也就是说,使其可终结,最终确定,然后回收。)但由于某种原因,它们被留在那里。它的代码如下:

简化的程序流程和会话类(没有无用的信息)。

经过大量的 GC 循环后仍保留在内存中。这是 GC 上的日志(G1,混合)

在下图中,您可以看到问题会话的根路径,并且您可以看到只存在弱引用链。

在此处输入图像描述

请帮忙。或者至少给出一些建议。

0 投票
1 回答
35 浏览

java - Cache Invalidation while Getting from WeakHashMap

I cache database connection objects via WeakHashMap as like:

Is it possible:

If statement is checked and seen that there is already an object at cache and before running else statement cache is invalidated?

0 投票
3 回答
259 浏览

java - WeakHashMap 如何在后台工作

我调查了 WeakHashMap 我们的代码以了解更多关于WeakReference

我发现该条目如下所示:

因此,当我们创建新条目时,我们调用super(key, queue);. 它是WeakReference构造函数。据我了解,在 GC 收集对象之后,新的引用(我相信它应该是对 的引用key)将出现在队列中。

我还注意到在每个操作上调用的方法:

看起来我们 (Entry<K,V>)是从队列中获得的。我不知道如何解释这个(第一个问题)。这段代码:

始终输出 null,因为对象已被 GC 收集

对我来说也很奇怪,我们可以对已经被 GC 收集的 Object 进行引用。实际上我希望引用应该出现在队列中,但我无法读取有意义的内容,因为对象已经收集(第二个问题)。

0 投票
0 回答
131 浏览

c - 需要检查插入 100 万个键值后我的哈希表占用了多少内存

我正在使用khash.h库进行散列。我想检查插入 100 万个密钥后它消耗了多少内存。

这是代码。

https://github.com/attractivechaos/klib/blob/master/khash.h

我想要什么:我在此表中输入 n 个唯一条目。在插入键和值之后,我想检查这个 hastable 消耗了多少空间。

问题:输入 1000 条目后的示例。当我尝试使用kh_size(h)给出的函数获取哈希表的大小时,khash.h我只得到 387 个条目。但是当我试图通过给出我能够获得的密钥来获得价值时。

这是我的代码:

0 投票
4 回答
1275 浏览

java - 自动删除 WeakHashMap 中的条目

有一个用例如 500 个条目初始化的 WeakHashMap 实例。现在,它的密钥在运行的应用程序中的任何地方都没有被引用一天左右。经过一定时间后,此地图的条目会自动删除吗?

我的理解是,如果未引用密钥,则将从地图中删除相应的条目。

0 投票
1 回答
531 浏览

java - 当实际对象被垃圾收集时,WeakHashMap 中的条目中的值如何被垃圾收集?

首先,我想澄清我对以下问题的理解,WeakReference因为以下问题取决于相同的问题。

上面代码的输出是

null java.lang.ref.WeakReference@7852e922

这意味着,尽管一旦 GC 运行,实际的 person 对象就会被垃圾回收,但WeakReference<Person>内存中存在一个类对象,此时它不指向任何东西。

现在考虑到上述理解是正确的,我对它的WeakHashMap<K,V>工作原理感到困惑。在下面的代码中

输出: Value gone

现在的问题是,据说 key inWeakHashMap<K,V>是一个弱引用,这意味着在上面的代码中,当p成为null实际对象时可以被垃圾收集,因为没有更多对该对象的强引用,但是the 和作为类对象的值PersonMetadata正在被垃圾收集,因为第一个代码证明WeakReference即使收集了实际对象,类的对象也没有被垃圾收集。

0 投票
3 回答
237 浏览

java - 具有不可变键的 Java WeakHashMap

我想使用WeakHashMap将在内存中短时间存在的对象。

每个对象都有一个 id(唯一的整数字段,它是 DB 的主键),所以我的第一个想法是使用该字段作为对象的键。

但是,Integer 是不可变的,因此 AFAIK,哈希将产生另一个不可变的 Integer,因此只要任何其他不相关的对象指向它,该对象就不会被 GC。

有没有办法在 a 中使用整数键WeakHashMap

0 投票
3 回答
136 浏览

java - 弱参考可维护性

我正在阅读java中的弱引用,听起来很简单,如果一个对象只有弱引用,那么它可以被垃圾收集器收集。除非您的参考在您使用该值之前已失效,否则会发生什么?

例子:

假设我有一个带有键 {1,2,3,4,5} 的弱哈希图,所有值都为 1。现在假设您有一个用于 [1:10] 中数字的随机数生成器。现在每次获取数字时,它都会检查它是否是映射中的键,然后对该键提供临时强引用。因此,使用此设置,您将拥有一些具有强引用的键并因此保留在内存中,但您也有可能某些键在被选择之前就已失效。

如果我对弱哈希映射的直觉是正确的,这是否意味着映射将在某个时候从其原始状态改变?

0 投票
2 回答
231 浏览

java - 避免 Java 接口中的样板

我正在尝试使用存储过程构建键值存储,并且发现枚举在定义事物时非常方便。我希望数据库成为表的枚举,并且表与操作枚举和区域枚举相关联。问题是枚举不能扩展抽象类,所以我必须使用接口。所以我有很多枚举,每个枚举都必须实现相同的代码(定义相同的字段,编写相同的构造函数来填充这些字段,并覆盖使用这些字段的 getter 和方法)。这是此类枚举的示例:

我想避免所有重复的样板文件并尽可能尊重 DRY,所以我开始使用内部类来表示字段:

这有助于减少样板文件,但我对 Java 还很陌生,担心这可能是一种反模式。它还公开了一个我不想成为接口一部分的变量,并添加了可能会损害性能的额外级别的函数调用。我想到的一种保持公共接口清洁的解决方案是将字段对象保持在静态 WeakHashMap 中,并在接口实例上键入:

这个想法的灵感来自 Python 的属性,但它存在一些问题:

1)它并没有完全摆脱公共接口的污染,它只是稍微混淆了它。

2) 它可能会导致更大的性能损失。

3) 它隐式地要求实现者在构造函数中绑定一个 Fields 对象。

有没有更好的方法来做到这一点?上述两种解决方案是否比我指出的问题更严重(性能下降和代码不干净)?我试图遵守得墨忒耳法则,但这感觉可能会在以后引起一些耦合问题。

编辑:在适当的地方添加了“最终”

编辑 2:增加了对开头段落的说明并稍微清理了示例