作者LaPass (LaPass)
看板java
标题Re: [问题] 在物件被注销时自动执行某些事
时间Wed Jun 13 13:53:59 2012
先道歉,因为上次的范例有错
Conn conn= new Conn();
conn.select();
//conn.close();
conn=null;
Thread.sleep(600000L);
那个Conn是我抓现成的范例来改的
我後来才注意到那个范例会用static的栏位去存Connection
所以连线不会被释放.....
後来把那个Conn改成动态栏位,并呼叫System.gc()之後
连线就会被释放了,这时候finalize也会被呼叫
从mysql的SHOW PROCESSLISE去看,也看的到连线被关闭
所以,理论上来说,开了连线之後丢着不理他
等Connection进入GC之後,连线就会被关闭了
基本上是不用担心连线被卡住的问题
只是系统的GC时间点.....
我只知道jvm有条执行绪专门在处理GC,至於执行的时间、条件就不清楚了
另外,之前我在写android时有用过stocket
那时stocket没呼叫close,就真的不会切断连线,即使activity被关闭了也一样
印象中只有在手机关机时,server端才会显示client断线
我不清楚android在底层是怎麽处理的
也看过activity关闭重新打开之後,上次设定的static栏位的值还在之类的状况
我猜这跟平台的运作有关系
所以我不确定依靠GC去关Connection,会不会遇到什麽问题
还有,看到推文有提到PhantomReference之类的东西
看起来挺有趣的.....
java.lang.ref
PhantomReference
Reference
ReferenceQueue
SoftReference
WeakReference
目前我试过的只有里面的get()那个方法
被WeakReference SoftReference参考的物件,在符合GC条件时一样会被回收掉
很适合用来侦测物件是否存活、资源管理之类的用途......
好像也可以在物件符合GC条件时,把物件拿回来的样子
这部分的功能我只看过javadoc,还没实际试过
如果可以运作的话
就可以做出自动回收Connection、PreparedStatement之类的功能了
--
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.59.16.65
1F:推 chchwy:Effective Java says: nerver rely on finalizer. 06/13 14:41
2F:→ LaPass:那可以依赖Reference吗? XD 06/13 16:05
3F:→ dou0228:与其相信GC/finalizer/Reference, 不如直接 call close 06/13 17:37
PhantomReference
SoftReference
WeakReference
之後试出来的结果,上面这几个都没办法这样用
这几个在绑定的物件的finalize被呼叫过後
才会被放到ReferenceQueue中
等於是说..... 这只用在物件被注销後,打算来做些什麽事才会用到
我能想到的用途也只有.....
记忆体快取之类的功能而已
另外,试着让程式不呼叫System.gc(); 让他跑
结果程式跟mysql的连线就挂在那边,一个多小时都没断掉 (都没进行过gc)
相对应的Reference物件当然也没进到ReferenceQueue中
如果设定个回圈让系统去gc
大概第一、二次呼叫gc的时候就会自己把连线切断了
另外SoftReference、WeakReference、PhantomReference在遇到GC时的差异是
WeakReference跟PhantomReference第一次GC时就会被清除
SoftReference第二次才会被清除
※ 编辑: LaPass 来自: 125.233.152.211 (06/14 08:14)
4F:→ dou0228:System.gc 不保证一定会执行,所以量大你依赖它 = 找死 06/14 08:30
5F:→ bitlife:再讲一次,不应在finalize才释放自OS/其它AP取得应还的资源 06/14 08:58
6F:→ gwokae:楼上 & 楼楼上 +1 06/14 09:15
7F:→ LaPass:现有的Connection pool都是设定时间,超时就拿回去,这可能 06/14 10:30
8F:→ LaPass:是目前最好的解决法了。 06/14 10:36
9F:→ qrtt1:并没有超时就会拿回去,要视你的 configuration 而定。 06/14 10:43
10F:→ qrtt1:并且 connection pool 大多再包一层 proxy,会侦测发出去的 06/14 10:44
11F:→ qrtt1:connection 有没有动作,要 idle 到那个时间有困难。。 06/14 10:45