【问题标题】:Force removing object from memory强制从内存中删除对象
【发布时间】:2013-05-17 10:59:42
【问题描述】:

即使对象有引用(c# 或 Java),我如何删除它?

例如:

void Main()
{
    var f = new Foo();
    var person = f.GetPerson();

}

public class Foo
{
    private object _person;

    public Foo()
    {
        _person = new object();
    }

    public object GetPerson()
    {  
         return _person;
    }
}

我想从内存中删除_person,我该怎么做?

【问题讨论】:

  • _person = null; 使 _person 有资格进行垃圾回收,但您无法确定垃圾回收器何时将其从内存中删除
  • @PermGenError 不幸的是,我无法从 Main 方法访问 _person。
  • @Neir0 你的 Foo 中没有 set_person(watever) 吗?
  • @PermGenError _person 是私有字段,如果我可以从外部代码(而不是 Foo)更改它,那么公开它不是更好吗?
  • 你真正想要达到什么目的。如果您更清楚地解释问题,范围更广,人们可能会提供帮助。

标签: c# java garbage-collection


【解决方案1】:

你不能,简单地说。

如果您确实想实现类似的目标,您可以通过 proxy 引用您的 Person,然后传递代理。因此,您可以将基础 Person 引用设置为 null(仅表明该对象可用于删除 - 强制删除),但客户端仍将包含代理引用。

您可能想查看Java SoftReferences and WeakReferences,它们是相关的,并且可以在垃圾回收周期中丢弃对象,尽管它们的弱/软引用在其他地方可用。

【讨论】:

    【解决方案2】:

    您不能通过托管语言的引用从内存中删除对象。

    您可以通过将引用设置为 Null 并调用 GC.Collect() 从 C# 中将其从内存中删除

    【讨论】:

      【解决方案3】:

      基本上,您希望使活动引用无效。这将打破具有自动内存管理的语言的关键假设,即不可能取消引用无效指针。至少在 Java 中这肯定是不可能的,我邀请 C# 专家为这个社区 wiki 贡献 C# 特定信息。

      针对您的要求的解决方案:您必须将对对象的引用封装在另一个对象中,并且永远不要让引用逃逸,以确保该引用的 100% 所有权。所以外部对象需要复制内部对象的完整 API,基本上是 Decorator 模式。

      如果这样做,您可以随时选择将内部引用设置为null,从而可靠地释放对象。

      【讨论】:

        猜你喜欢
        • 2011-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-09
        • 1970-01-01
        相关资源
        最近更新 更多