关于Java的对象的创建和回收机制的小结

来源:互联网 发布:软件需求可行性分析 编辑:程序博客网 时间:2024/06/05 11:28

<!--@page { margin: 2cm }P { margin-bottom: 0.21cm }-->

关于Java的对象的创建和回收机制的小结

1Java中对象的创建方式

平时我们写的一条创建对象的语句,如:Objecto = newObject();,就是创建了一个Object的对象,并且有o来应用这个对象,必须强调的一点是——Java是没有指针这个概念的,所以这里说的是引用。

当执行过这一条语句之后,在内存中就会出现两个位置,用于保存oo所引用的对象,这两个地方分别是一个栈和一个堆,在栈里放的是引用o,在堆里放的是o所引用的对象,那么o是怎么引用到那个新创建的对象的呢?这里需要说明一点,其实本质上在栈里的引用变量存放的都是一串代表01的位,这一些位组合起来便是在堆里的对象的地址,这有点像是C语言里的指针。

如果又有一个Objecto2 =o;那么o2这个变量也会保存到栈里面,并且o2在栈里的值和o是相同的,也就是说o2o引用的是同一个对象。但是如果有:Integeri1 = new Integer1;Integeri2 = newInteger(1);这两条语句,那么将会在堆里生成两个不同的对象,并且分别由i1i2引用,也就是说这时候i1i2内的位组成的数值时不相等的。

 

2Java中对象的销毁机制

Java对象的销毁机制又称作GC机制,就是垃圾回收的意思,其实在Java中的api中有提供System.gc();这个方法进行垃圾回收,但是必须说明的是System.gc();这个方法只是“建议”JVM进行垃圾回收,但是事实上JVM在调用这个代码的时候是否进行垃圾回收,那是不确定的!一般而言,JVM都会在它认为必要的时候才自动进行GC操作,所以个人认为在代码中人为的调用gc()意义不大。

怎样的对象是JVM认为可以回收的呢?其实就是没有用的对象,JVM就会认为可以回收了。而JVM对没用的对象的定义是——没有有效引用的对象!比较好理解的是没有引用的对象,就是说这个对象没有至少一个引用变量引用了,如上面所创建的o引用的Object对象,现在我们将o= null;这个时候这个Object依然不能被认为是可以GC的,因为还有一个o2在引用它,所以我们再将o2=null;这个时候,JVM可以认为这个Object对象是可以GC的了,当然前提是假设没有其它变量再引用它了,当然也得看JVM什么时候进行GC,所以在这时我们至少可以确认这个Object对象不能被我们调用了,它是否还在内存,这就是JVM做的工作了。

现在我来介绍一下什么叫做有效的引用,请看如下代码:


 

23行代码执行完后,smoochbooch是否可以被GC呢?答案是可以的!这是因为虽然boochsmooch互相引用,但是我们已经无法再从外部调用这两个对象了,这就是俗称的孤岛参照,也就是无效的引用!所以JVM会在这个时候发现他们,并认定他们是可以被回收的对象。

原创粉丝点击