- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在我看来,当我在对象类的委托(delegate)方法上使用 WeakReference
类时,该对象类会被 GC 收集,但它的另一个副本仍然驻留在 弱引用
?
我觉得很难用语言来解释。我举个例子。我有以下名为 TestObject
的对象类:
class TestObject
{
public string message = "";
private delegate string deleg();
public TestObject(string msg)
{
message = msg;
}
public Delegate GetMethod()
{
deleg tmp = this.TestMethod;
return tmp;
}
public string TestMethod()
{
return message;
}
}
现在,在我的主应用程序中,我尝试通过 WeakReference
引用 TestObject
中的方法 TestMethod
。目的是当所有硬引用都消失时,TestObject
可以被 GC 收集。这是我的主要应用程序的样子:
static void Main(string[] args)
{
var list = new List<WeakReference>();
var obj = new TestObject("Hello 1");
list.Add(new WeakReference(obj.GetMethod()));
Console.WriteLine("Initial obj: " + ((Delegate)list[0].Target).DynamicInvoke()); //Works fine
obj = null; //Now, obj is set to null, the TestObject("Hello 1") can be collected by GC
GC.Collect(); //Force GC
Console.WriteLine("Is obj null: " + ((obj) == null ? "True" : "False"));
Console.WriteLine("After GC collection: " + ((Delegate)list[0].Target).DynamicInvoke());
Console.ReadKey();
}
这是我运行上面代码时的输出:
奇怪的是。 在第一行,obj
可以打印"Hello 1"
因为它刚刚初始化并且obj
持有一个对 TestObject
的引用。全对了。接下来,obj
被设置为 null
并且 obj = null
并且 GC 被强制收集。因此,在输出的第二行,obj
为 true
为 null。最后 在最后一行,因为 GC 已经收集了 obj
,我希望它要么抛出一个 NullReferenceException
,要么什么都不打印在输出上。然而,它实际上打印了与输出的第一行相同的内容! TestObject
不应该在此时由 GC 收集吗?!
这引出了一个问题,即在我将 obj 设置为 null 后,最初保存在 obj
中的 TestObject
是否后来被 GC 收集。
如果我将整个对象传递给 WeakReference
,即 new WeakReference(obj)
,而不是将委托(delegate)传递给 WeakReference
,它本来可以完美运行的。
不幸的是,在我的代码中,我需要向 WeakReference
传递一个委托(delegate)。我怎样才能让 WeakReference
正常工作,以便 GC 可以通过仅引用委托(delegate)来收集对象?
最佳答案
我认为问题出在您的测试中 - 而不是在框架中。将局部变量设置为 null 似乎并没有达到您的预期。如果我们完全跳过局部变量,我们会在“之后”行得到预期的 NullReferenceException:
static void Main(string[] args)
{
var list = new List<WeakReference>();
//var obj = new TestObject("Hello 1");
list.Add(new WeakReference(new TestObject("Hello 1").GetMethod()));
Console.WriteLine("Initial obj: " + ((Delegate)list[0].Target).DynamicInvoke()); //Works fine
//obj = null; //Now, obj is set to null, the TestObject("Hello 1") can be collected by GC
GC.Collect(); //Force GC
//Console.WriteLine("Is obj null: " + ((obj) == null ? "True" : "False"));
Console.WriteLine("After GC collection: " + ((Delegate)list[0].Target).DynamicInvoke());
Console.ReadKey();
}
关于c# - 当 WeakReference 引用委托(delegate)时 GC 不收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14007569/
当 WeakReference.Target 引用的目标对象被垃圾回收后,WeakReference 会发生什么? WeakRerence 是否存活并保持存在? 我问的原因是我有一个存储在 List
在 .NET 3.5 中,WeakReference 是否与 String 一起工作,还是应该将它包装在一个小的“类”中以使其与它一起工作? 最佳答案 System.String ( string 在
我最近注意到我们的一个应用程序中出现了一种奇怪的行为。 Exception=System.InvalidCastException: Unable to cast object of type 'Sy
我正在开发一个订购系统,这是我的场景:我有一个类以“缓存”策略之类的方式保存新订单。此时,我使用的是这样的HashMap: public static final Map orders = new H
我正在使用 JGroups 作为分布式系统。我想在远程 JVM 上创建对象并像在本地创建一样使用它们。因此,我使用 java.lang.reflect.Proxy 来包装 RPC 调用。这与 RMI
这失败了 public void testWeak() throws Exception { waitGC(); { Sequence a = Sequence.val
考虑下一个 fragment : private void foo() { A a = new A(); WeakReference weakA = new WeakReference
我的静态处理程序对我的 Activity 有一个 WeakReference(这是为了防止记录良好的内存泄漏问题)。 我发布了一条延迟很长时间的消息,我希望将此消息传送到我的 Activity (应该
为什么在下面的程序中调用下面的System.exit(0)?只有本地图引用变量变为空时才应调用它。 import java.lang.ref.WeakReference; import java.ut
我在这里有一个奇怪的行为:我在运行在 DLOG 终端(Windows Embedded Standard SP1)上运行的 WPF 应用程序的生产中出现大量内存泄漏,如果我在普通桌面(Win7 教授)
我有一个缓存,它使用 WeakReferences 来缓存对象,使它们在内存压力的情况下自动从缓存中删除。我的问题是缓存的对象在存储在缓存中后很快就会被收集。缓存在 64 位应用程序中运行,尽管仍
看到篇帖子, 国外一个技术面试官在面试senior java developer的时候, 问到一个weak reference相关的问题. 他没有期望有人能够完整解释清楚weak reference
我们平常用的都是对象的强引用,如果有强引用存在,GC是不会回收对象的。我们能不能同时保持对对象的引用,而又可以让GC需要的时候回收这个对象呢?.NET中提供了WeakReference来实现。弱引用
我明白了什么System.WeakReference确实如此,但我似乎无法理解它可能有用的实际例子。在我看来,这个类(class)本身就是一个黑客。在我看来,还有其他更好的方法来解决我见过的示例中使用
如何自动清除instanceMap的key和value;当 getInstance() API 返回的 Conf 对象是使用 WeakHashMap 和 WeakReference 进行垃圾收集时
我做了一个快速测试来说明我的问题: @Test public void testRemovalFromWakLinkedList() { Object o1 = new Object();
我有另一个 C# 理论问题,我希望我能弄清楚,我已经看到一些 WeakReference 示例,但它们对我不起作用,但我在一些人的评论和文章中读到这些示例对他们有用.我正在努力找出为什么这些样本对我不
假设我有两个 WeakReference 实例,我想看看它们是否指向同一个对象。您可以想象两种场景,一种是两个引用都指向同一个对象: SomeClass a = 1; var wr1 = new We
我知道如果一个对象没有引用,并且 GC 清除了它,该对象的 WeakReference.Target 属性将返回 null, 但是假设这个对象没有强引用,但是GC还没有清除它,有没有办法通过它的弱引用
我知道我应该只对大对象使用 WeakReference,但我对以下场景感到好奇: object obj = 1; //Int32 var wk = new WeakReference(obj);
我是一名优秀的程序员,十分优秀!