gpt4 book ai didi

java - 如何编写代码来帮助垃圾收集器

转载 作者:行者123 更新时间:2023-11-29 08:22:33 25 4
gpt4 key购买 nike

在面试中我遇到了一个问题——“如何在编写代码时帮助垃圾收集器?”。

在我看来,GC 工作得很好,除了基本的良好代码实践之外,我们不需要使用任何东西,后来补充说,在 finally 子句中关闭资源肯定有助于 GC,但通常对这样的问题感到惊讶。

有好的回复吗?我们是否需要做一些不可思议的事情来帮助垃圾收集器?

最佳答案

垃圾收集器是一项“任务”,它会定期扫描您的对象以检测未使用的对象(实际上它是一种模拟具有无限内存的机器的机制)。

因此,当您持有对不再需要的对象实例的引用时,必须将其设置为null,以便让垃圾收集器知道您不再对它感兴趣那个实例(可能还有它的后代)。

这并不意味着您必须在使用后将每个变量设置为 null,但您必须注意字段。由于 Java 没有处置模式(有关更多信息,请参见 here),您必须设计 API 来模仿它:当您使用完包含要释放的引用的对象实例时,您必须添加一个执行此类操作的适当方法。

考虑以下示例:

class MyClass1
{
int Field1;
int Field2;
int Field3;
int Field4;
}

class MyClass2
{
private MyClass1 m_MyReference;

public MyClass2()
{
m_MyReference = new MyClass1();
}

public void DoSomething()
{
// do something here that uses m_MyReference.
}
}

如果 MyClass2 的一个实例被保留,但程序的其他一些可访问实例(例如,单例或当前在堆栈中的某个实例),您将永远不会释放与 MyClass1 关联的内存,因为它仍被 引用m_MyReference.

这不好吗?这取决于 MyClass2 和 MyClass1 真正在做什么。

如果您知道 MyClass2 可能有很长的生命周期并且您希望保留对 MyClass2 的引用但要释放与 MyClass1 关联的内存,您必须执行类似于以下代码的操作:

class MyClass2
{
private MyClass1 m_MyReference;

public MyClass2()
{
m_MyReference = new MyClass1();
}

public void DoSomething()
{
// do something here that uses m_MyReference.
}

public void Dispose()
{
m_MyReference = null;
}

}

通过这种方式,您可以向调用者公开一种方式,表明您不再持有对您不需要的实例的引用。

请记住,简单地将 null 分配给变量或字段,不会自动释放内存。垃圾收集器是异步的,并在它决定时运行。希望在不深入的情况下给出这个想法。

关于java - 如何编写代码来帮助垃圾收集器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56373929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com