当前位置: 技术问答>java相关
垃圾回收器:gc()的细节,请讨论
来源: 互联网 发布时间:2015-08-23
本文导语: 请看如下两段代码: 01: class Tree { 02: public void finalize() { 03: System.out.println("over!"); 04: } 05: } 06: public class Test1 { 07: public static void main(String args[]) { 08: Tree treeObject = new Tree(); 09: Syste...
请看如下两段代码:
01: class Tree {
02: public void finalize() {
03: System.out.println("over!");
04: }
05: }
06: public class Test1 {
07: public static void main(String args[]) {
08: Tree treeObject = new Tree();
09: System.gc();
10: }
11: }
01: class Tree {
02: public void finalize() {
03: System.out.println("over!");
04: }
05: }
06: public class Test2 {
07: public static void main(String args[]) {
08: new Tree();
09: System.gc();
10: }
11: }
只有第6行和第8行略有不同。
它们的运行结果不同,可以肯定是由于第8行的不同造成的。
但为什么会产生这样不同的结果?
01: class Tree {
02: public void finalize() {
03: System.out.println("over!");
04: }
05: }
06: public class Test1 {
07: public static void main(String args[]) {
08: Tree treeObject = new Tree();
09: System.gc();
10: }
11: }
01: class Tree {
02: public void finalize() {
03: System.out.println("over!");
04: }
05: }
06: public class Test2 {
07: public static void main(String args[]) {
08: new Tree();
09: System.gc();
10: }
11: }
只有第6行和第8行略有不同。
它们的运行结果不同,可以肯定是由于第8行的不同造成的。
但为什么会产生这样不同的结果?
|
IBM上面有篇好文章说明了gc的实现情况,对于Test1来说,new Tree()生成的对象还被treeObject引用,gc无法回收new Tree();对于Test2,new Tree生成的对象没有被任何对象引用,被gc回收
|
因为第一个程序的Tree还不是垃圾呢。只有没有被任何句柄引用的对象才是垃圾。在第一个程序中,当调用gc()时,treeObject还没有出作用域,因此Tree的这个对象还有一个引用也就是treeObject,因此不是垃圾不会被回收。而在第二个程序中调用gc()时Tree对象没有任何句柄引用,所以是垃圾回收之。