日期:2014-05-16 浏览次数:20402 次
众所周之,java中操作的都是对象的引用,如下例
Obj1 obj1 = new Obj1(); Obj2 obj2 = new Obj2(); obj2.setObj1(obj1); log.info(obj1 == obj2.getObj1()); obj1 = null; log.info(obj2.getObj1()==null);
obj1与obj2中的属性实际上是两个引用,都指向了同一个对象;
如果把obj1设为null,实际上是取消了obj1对该对象的引用,此时obj2中的属性的引用还指向该对象;
java垃圾回收时,实际是判断一个对象是否被引用,如果没有引用则将该对象销毁;
?
那么在数据库连接池(如DBCP)中,如果从连接池中借出一个连接不归还的话,数据库连接池是有办法将该连接回收的;
实际上我们借出来的是一个引用,数据库连接池管理的也是一个引用;
数据库连接池判断是否回收连接,实际是记录了该引用借出的时间,如果超过了设定时间还未归还,将连接池中管理的引用设为null,取消了连接池中引用对该连接对象的引用,而且其假设用户借出的引用也是使用完毕,用户借出的引用也不再指向该连接对象了,这样在下一次垃圾回收时,该连接对象因为没有被引用从而被回收了;
我们在一个方法内部创建的引用,在方法结束后,引用全都被自动销毁,取消了与实际内存中对象的引用,从而保证了对象被回收;
但是如果用户通过静态对象保留了该引用,未将其销毁,那么即使数据库连接池从池中将引用关闭,实际上用户保留的引用也是可以继续使用的。
?
以上仅为猜测,有时间测试一下~~
?