每个Java开发人员都知道,不再使用Java对象时将对其进行垃圾回收。我想知道JVM如何确定必须选择哪个对象进行垃圾收集。(比如说..如果我有10个对象。如果10个对象中有2个对象被垃圾回收,则jvm如何找到这两个对象)。
JVM使用“标记和清除”算法(如果正确的话)。
1)例如我在下面提供了字符串对象方案
class Sample{
public static void main(Strings args[]){
String s1=new String("10");
String s2=new String("20");
String s3=new String("30");
String s4=new String("40");
String s5=new String("50");
String s6=new String("60");
String s7=new String("70");
s1=null; //now s1 is eligible for gc collection
s2=null; //now s2 is eligible for collection
}
}
//现在s1和s2可以进行gc收集了。如果我明确地将null引用(s1,s2)设为null,那么分配给堆的内存又会怎样呢?会被释放吗?
此处的内容非常简洁:http://www.brpreiss.com/books/opus5/html/page424.html
标记清除算法称为跟踪垃圾收集器,因为它可以跟踪程序直接或间接访问的对象的整个集合。
程序可以直接访问的对象是处理器堆栈上的局部变量以及引用该对象的任何静态变量所引用的对象。在垃圾回收的上下文中,这些变量称为roots。如果某个对象被某个其他(直接或间接)可访问对象中的字段引用,则该对象是间接可访问的。
因此,当您s1=null;
断开根连接时,相应的实例就可以进行收集了。
实际的“收集”(释放堆)是在GC实际执行时发生的。至于确切何时发生,还没有一个万能的答案。请参阅Java中垃圾回收的频率是多少?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句