Java 谁来决定任何对象是否有资格进行垃圾收集?决定这一点的参数是什么?
任何特定的对象何时有资格进行垃圾收集?考虑哪些参数决定了这一点Java 谁来决定任何对象是否有资格进行垃圾收集?决定这一点的参数是什么?,java,garbage-collection,Java,Garbage Collection,任何特定的对象何时有资格进行垃圾收集?考虑哪些参数决定了这一点 MyClass mc = new MyClass(); mc.myMethod(); //line1 mc=null; //line2 mc=new object(); //line3 mc.myMethod(); //line4 mc=null; //line5 在这种情况下,当mc对象有资格进行垃圾收集时?一旦不再有活动线程(直接或间接通过静态字段等方式)对对象实例的引用,它就有资格进行垃圾收集 在本例中,在分别将第2行
MyClass mc = new MyClass();
mc.myMethod(); //line1
mc=null; //line2
mc=new object(); //line3
mc.myMethod(); //line4
mc=null; //line5
在这种情况下,当mc对象有资格进行垃圾收集时?一旦不再有活动线程(直接或间接通过静态字段等方式)对对象实例的引用,它就有资格进行垃圾收集 在本例中,在分别将第2行和第5行中对对象的唯一引用清空之后(毕竟有两个对象)
当然,如果
mc.myMethod()
有一个奇怪的副作用,使mc
保持活动状态(例如将其保存在线程本地或静态变量中),则情况可能并非如此。每个没有指向它的变量的对象都有资格进行垃圾收集
当您这样做时:mc=null//第2行
您创建的第一个对象符合垃圾收集条件,因为变量mc不再指向它强>
这一行不会编译:mc=new object()强>
不能以这种方式创建对象。对象是什么?此决定由垃圾收集器本身作出,要收集的对象的条件取决于对它的引用数。所以,如果一个对象没有任何引用,它将成为集合的候选对象 这并不意味着它是间接收集的,只是收集的候选对象。 对象集合由以下机制控制: 当运行程序中的任何指针无法再访问对象时,该对象被视为垃圾。最直接的垃圾收集算法只是在每个可到达的对象上迭代。剩下的任何对象都将被视为垃圾。这种方法所需的时间与活动对象的数量成正比,这对于维护大量活动数据的大型应用程序来说是不允许的 关于您的代码,在第一行中创建的对象
MyClass mc=new MyClass()代码>在执行第三个后立即成为收集的候选mc=null//第2行
按照相同的模式,在执行第5行后,在line3
创建的新对象(我不认为该行与您认为的一样:该行不应该是mc=new MyClass();
?)成为候选行
请注意,即使您删除了line2
,第一个对象仍将可供收集,因为它不再被引用。在第2行,在第1行创建的对象和在第5行创建的对象符合GC条件。除非在使用这些对象的myMethod()中生成任何新线程,否则什么是mc对象????在第1行创建的MyClass对象在第2行执行后可能有资格成为垃圾。执行第5行后,在第3行创建的对象可能有资格成为垃圾。