shr*_*ree 18 garbage-collection
在java中,什么是无法访问的对象?对象何时无法访问?在研究垃圾收集时,我无法理解这个概念.
任何人都可以提供任何想法吗?
map*_*aft 23
当没有任何引用变量引用它时,或者当它在孤岛中孤立时.
一个岛是一个具有指向它的引用变量的对象,但该对象没有指向它的引用变量.
class A { int i = 5; }
class B { A a = new A(); }
class C {
B b;
public static void main(String args[]) {
C c = new C();
c.b = new B();
// instance of A, B, and C created
c.b = null;
// instance of B and A eligible to be garbage collected.
}
Run Code Online (Sandbox Code Playgroud)
编辑:只是想指出,即使A的实例有一个引用,它现在在岛上,因为B的实例没有引用它.A实例有资格进行垃圾回收.
在对象图中,当没有链接到它时,引用将变得无法访问。然后垃圾收集器扫描这些悬空的孤立对象并清除以重新获得分配的内存。
java.lang.ref.{Phantom,Soft,Weak} 引用 将无法访问的对象排入队列。如果终结器运行,GC 就知道它无法访问。
阅读有关终结的信息 - http://java.sun.com/developer/technicalArticles/javase/finalization/
在仅具有强引用的语言中,堆对象可以从程序中访问或不访问。可到达对象的集合是由程序中指向堆对象的类变量和方法变量的集合决定的。该集合通常称为程序的根集。程序根集中的变量所指向的对象是可达的。此外,对象可能是间接可达的。也就是说,如果有另一个可达对象指向某个对象,则该对象是可达的。这种从程序的根集到堆对象的引用链称为可达路径。一个对象可能有多个可达路径,也可能根本没有可达路径。如果对象没有可达路径,则它被视为垃圾,并且可以立即被垃圾收集器收集。
当对象不再存在强引用时,该对象将进入不可访问状态。当一个对象无法访问时,它就成为收集的候选对象。请注意措辞:仅仅因为一个对象是收集的候选者并不意味着它将立即被收集。JVM 可以自由地延迟收集,直到对象立即需要消耗内存为止。需要注意的是,并非任何强引用都会在内存中保存对象。这些必须是从垃圾收集根链接的引用。GC 根是一类特殊的变量,包括
(任何线程的)堆栈上的临时变量(来自任何类的)来自 JNI 本机代码的特殊引用
如果您愿意,请访问更多 http://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html
当没有更多对象引用或这些引用本身来自不可修复对象时,该对象将不可修复。
Integer i = new Integer(4);
// the new Integer object is reachable via the reference in 'i'
i = null;
// the Integer object is no longer reachable.
Run Code Online (Sandbox Code Playgroud)