强制从内存中删除对象

本文关键字:删除 对象 内存 | 更新日期: 2023-09-27 18:14:18

我怎么能删除对象,即使它有引用(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,并传递代理。因此,您可以将底层Person引用设置为null(简单地表示对象可用于删除—而不是强制删除),但客户端仍将包含代理引用。

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

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

在c#中,你可以通过将引用设置为Null并调用GC.Collect()
来从内存中删除它。

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

对你的需求的解决方案:你必须封装引用到你的对象在另一个和永远不会让引用转义,以确保100%的所有权,该引用。所以外部对象需要复制内部对象的完整API,基本上是Decorator模式。

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