问题标签 [weak-references]
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.
java - 我可以/应该在我的复杂对象结构中使用 WeakReference 和 db4o 吗?
我正在考虑将应用程序移植到 db4o。数据模型由许多相互之间有很多引用的小对象组成。例如,我有一本书指向作者和章节。章节有部分,部分有大量的文本、图像,并且它们引用了提到的字符。
我认为应该可以将元结构保留在内存中(除文本 blob 之外的所有内容),但我想知道是否可以使用一些涉及 WeakReference 的巧妙技巧,以便 db4o 将模型的一部分保留在我真正需要的内存中(即我最近一直在使用的)。
文本 blob 也是如此(应该在 1-10KB 左右)。是否可以在不必担心 DB 层的情况下获取字符串,并且不必使用 getter 内的人工 ID 查询文本 blob,并且无需使用始终将整个文本保存在内存中的硬引用?
java - 使用 db4o 在数据模型中缓存大孩子
我有一个带有骨架(元数据)和大型数据对象的数据模型。我想将骨架保存在内存中并保存对数据对象的弱引用。我了解如何使用纯 Java 实现这一点,如何创建 WeakHashMap 并进行清理等。但我想知道在数据对象被 GC 后恢复数据对象的最佳方法是什么?
我是否应该向我的地图添加一个技术密钥,将其分配给数据对象中的一个字段,以便我可以再次找到它?或者我应该调用 db.ext().getId() 并使用此 ID 作为技术密钥?如果是这样,加载父级时如何获取这些键?你有什么建议?
python - 在 python 中构建弱引用缓存
我目前正在用 python 编写一个项目,我需要一种通用对象的缓存,我已经决定为此使用 WeakValueDictionaries。这些泛型对象经常被许多其他非泛型对象引用。不过,我的主要问题是,我似乎无法将这些 WeakValueDictionaries 用于程序的许多不同部分的方法。如果可能的话,我宁愿不使用“全局”变量。
最好的祝福
弗雷德里克NS
c# - 压缩弱引用字典
我有一个带有属性Id的类Foo。我的目标是没有两个Foo实例同时具有相同的Id。
所以我创建了一个工厂方法CreateFoo,它使用缓存来为相同的Id返回相同的实例。
缓存实现为 Dictionary<TKey,WeakReference>,基于@JaredPar的Building a WeakReference Hashtable:
问题是 WeakReference 在其目标被垃圾收集后仍保留在字典中。这意味着需要一些策略来手动“垃圾收集”失效的 WeakReferences,正如@Pascal Cuoq在WeakReference.Target GC 后 WeakReference 会发生什么中所解释的那样。
我的问题是:压缩弱引用字典的最佳策略是什么?
我看到的选项是:
不要从 Dictionary 中删除 WeakReferences。IMO 这很糟糕,因为在我的应用程序的整个生命周期中都会使用缓存,并且随着时间的推移会积累很多死的 WeakReferences。
在每个Put和TryGetValue上遍历整个字典,并删除死的 WeakReferences。这在某种程度上违背了字典的目的,因为这两个操作都变成了O(n)。
在后台线程中定期遍历整个字典。鉴于我不知道CreateFoo的使用模式,什么是一个好的间隔?
将每个插入的 KeyValuePair 附加到一个双端链表。每次调用Put和TryGetValue都会检查列表的头部。如果 WeakReference 是活动的,则将该对移动到列表的末尾。如果它已死,则从列表中删除该对并从 Dictionary 中删除 WeakReference。
实现一个自定义哈希表,其细微差别是,当存储桶已满时,首先从存储桶中删除失效的 WeakReference,然后再照常进行。
还有其他策略吗?
最好的策略可能是具有摊销时间复杂度的算法。这样的策略存在吗?
java - 适合 Java 中的事件监听器的集合类
相关: java是否有“LinkedConcurrentHashMap”数据结构?
我正在寻找一个集合类来保存对事件侦听器的引用。
理想情况下,我希望该集合具有以下属性(按优先级排序):
- 维护插入顺序。较早的侦听器可能会取消该事件,从而阻止它被传递给后来添加的侦听器。如果使用诸如
HashSet
其迭代器可能以错误顺序返回元素的类,这将中断。 - 使用
WeakReference
s 以便侦听器列表不会阻止侦听器被垃圾收集。 - 该集合是 a
Set
,因此会自动删除重复项。 - 这
Iterator
是集合的线程安全快照,不受添加新侦听器的影响。还允许在多个线程上传递事件。(这不是必需的 - 我可以迭代该集合的克隆。)
我知道一些类满足了部分但不是所有这些标准。例子:
java.util.LinkedHashSet
(#1和#3)java.util.WeakHashMap
Collections.newSetFromMap
, 由(#2 和 #3)包裹javax.swing.event.EventListenerList
(需要一些额外的同步)(#1和#4)java.util.concurrent.CopyOnWriteArraySet
(#1、#3 和 #4)
但是#1和#2都没有。这样的类是否存在于某个图书馆中?
wpf - Josh Smith 的 RelayCommand 实施是否存在缺陷?
考虑参考Josh Smith 的文章 WPF Apps With The Model-View-ViewModel Design Pattern,特别是 a 的示例实现RelayCommand
(在图 3 中)。(这个问题不需要通读整篇文章。)
总的来说,我认为实现非常好,但我对'事件的CanExecuteChanged
订阅委托有疑问。状态的文档:CommandManager
RequerySuggested
RequerySuggested
由于此事件是静态的,它只会将处理程序作为弱引用。侦听此事件的对象应保持对其事件处理程序的强引用,以避免它被垃圾收集。这可以通过拥有一个私有字段并将处理程序分配为附加到此事件之前或之后的值来完成。
然而,示例实现RelayCommand
并没有对订阅的处理程序进行任何维护:
- 这是否将弱引用泄漏给
RelayCommand
客户端,要求用户自己RelayCommand
了解实现CanExecuteChanged
并维护实时引用? 如果是这样,是否有意义,例如,将 的实现修改为
/li>RelayCommand
如下所示,以减轻CanExecuteChanged
订阅者潜在的过早 GC:
python - 由于循环引用,不调用弱引用回调
我正在尝试为具有循环引用的 Python 类编写终结器。我发现弱引用回调是要走的路。不幸的是,我用作回调的 lambda 似乎从未被调用过。例如,运行以下代码:
返回:
删除循环引用使 lambda 回调起作用(打印“An A deleted: a1”)。用一个简单的函数调用替换 lambda 也可以,但是在初始化弱引用时参数值是固定的,而不是在调用回调时:
返回:
知道为什么 lambda 回调不适用于循环引用吗?
c++ - 如何进行原子比较和递增?
在我尝试开发线程安全的 C++ 弱指针模板类时,我需要检查一个指示对象仍然存在的标志,如果是,则增加对象的引用计数,我需要原子地执行这两个步骤。
我知道编译器提供的内在函数的存在,例如 _InterlockedCompareExchange() 和 _InterlockedIncrement()。但是我想要的是一个 interlockedCompareIncrement() 函数,是否有一种有效的方法可以使用其他原语来模拟这个内在函数,至少在 Windows x86 平台上是这样?
python - 何时在 Python 中使用弱引用?
谁能解释弱引用的用法?
文档没有准确解释它,它只是说 GC 可以随时销毁通过弱引用链接到的对象。那么拥有一个可以随时消失的物体有什么意义呢?如果我需要在它消失后立即使用它怎么办?
你能用一些很好的例子来解释它们吗?
谢谢
java - JDK 类中 java.lang.ref.WeakReference 对象的内存泄漏
下面的简单代码再现了java.lang.ref.WeakReference
堆中对象的增长:
以下是几秒间隔内 jmap 命令的输出:
注意 jmap 命令强制 FullGC。