让我们说我有一个类引用另一个类:
class1
{
}
class2
{
int A;
class1 B;
public class2(int a, class1 b){
A =a;
B = b;
}
现在在另一种方法中我创建了一个新实例:
class3
{
class2 myobject;
mymethod()
{
class2 myobject = new class2(45, new class1( some parameters));
}
}
当新class1
(某些参数)内存空闲时?
答案 0 :(得分:5)
什么时候释放新创建的class1实例?
不可能肯定地说。垃圾收集器可以在选择时释放它,或者选择永不释放它。
可以释放内存的最新内容是什么?
不要求释放内存。该程序可以永远运行,永远不会收集。
最早可以释放内存的是什么?
在class2
的实例分配之后,可以立即释放。鉴于永远不会读取局部变量,因此不需要实际存在局部变量。抖动可以将其优化掉,这意味着class2
没有gc根,因此可以立即释放,因此它所持有的class1
实例也可以。
更一般地说:虽然你想要了解运行时的工作方式是好的,但不要强调它。 99.99%的时间垃圾收集器完全按照您的意愿完成,而不用考虑它。
答案 1 :(得分:2)
当没有对它的引用并且该对象不能被访问时,垃圾收集器释放一个对象。
编辑: 如上所述 Theodoros Chatzigiannakis ,在垃圾收集器调用对象的终结器之后,该对象符合垃圾的条件 采集。垃圾收集器可以回收这种对象的内存。但我们不知道何时收集它。
垃圾收集器的一个问题是它不能保证它会执行 它在指定时间的任务。因此,垃圾收集器可以调用终结器 在对象变得无法访问之后的时间,并且可以回收任何内存 终结器执行后的时间。事实上,在应用程序终止之前,两者都不可能发生。因此,不清楚终结者是否或何时会被召唤。因此,很少使用终结器。
例如:
classObj obj = new classObj();
//we create an new object in memory (by invoking new classObj())
//and obj refers to it.
obj = null;
//now we change obj's reference to null but object
//that we created in memory still exists