|
|
1
3
是的,它们在执行静态函数之后被垃圾收集。您正在非静态上下文中创建对象,因此它们不是在加载程序堆中创建的。仅仅将引用传递给静态函数根本不会改变任何东西。 |
|
|
2
2
传递对静态方法的引用并不意味着该对象将以任何方式建立根,因此仅此一个方法不足以阻止它被收集。 是否可以在方法调用期间收集它,或者只有在它完成之后才能收集它,取决于方法如何处理参数,以及对象是否在方法调用之外使用。 例如,考虑这个假设代码:
在这种情况下,o可以在调用
在debug build中,所有变量和参数都被人为地保持活动,直到方法返回,这样您就可以设置一个断点并检查变量,即使没有使用它的代码了。 因此,如果您要从调试构建运行上述代码,那么对象将一直保持活动状态,直到main返回。 |
|
|
3
1
一旦对变量执行了静态方法,它就不再保存对它的引用(如果将其赋给静态变量,则不同)。但这并不意味着它将被立即垃圾收集。除非您明确地告诉GC运行,否则,当它运行时认为需要释放内存时,它就会运行。事实上,这在应用程序的生命周期中可能永远不会发生(资源将随着应用程序的结束而释放)。然而,这是极不可能的,尽管技术上是可能的。 |