Saturday, November 10, 2007

Re: Put releasing resource process in Object.finalize() is not safe.

Excellent research. If you mention this to an interviewer, you will look good.
The finalizer technique is widely used, which may not always imply effectiveness. The basic idea is, if my object (for example, a shopping cart object) holds a reference to a resource like a DB connection, then in my object's finalize(), it ought to release the resource. Logically sound ideas like this are not always 100% reliable, but still effective in my humble opinion.
"Defensive programming in-depth" suggests "design more than one layer of protection". If one layer is not "safe" as in this case, another layer may protect us.
Therefore, we should use both 1) finalizer and 2) finally(), if possible.
My new company (I should slowly learn to avoid mentioning my company's name) uses the finally{} technique in a lot of classes. I think probably every time a method gets a db connection, there's a finally() in that method.
I feel DB connection release is important. Some DB vendors charge license fees based on max simultaneous connections. If we pay x dollars for 20 simultaneous connections, then those 20 simultaneoud connections become a potential bottleneck. As soon as you release the connection, another (waiting) thread can use it to read/write data.
3) A third idea (?) -- An architect can instruct programmers to explicitly release resource as soon as they are done. Programmers are busy and forgetful, though. That's why architects like the finalizer idea.
4) Do you think a DB can detect idle connections and close them after x minutes of inactivity? Do you think a connection pool manager can?

Thanks for the excerpt. Quite relevant for me.
On 11/7/07, rong xia
Hi, Tan Bin,

We have ever discussed about garbage collection.
You mentioned a question that I can just roughly recall as: How do you make sure to release resource, such as DB connection or something else?
I answered without any hesitation: put it in the Object.finalize(). And it seems you agreed with me.
But I found it's not correct, because of the following reasons: I copied and pasted.
As you program in Java, you must keep in mind that it is the garbage collector that runs finalizers on objects. Because it is not generally possible to predict exactly when unreferenced objects will be garbage collected, it is not possible to predict when object finalizers will be run. As mentioned in Chapter 2, "Platform Independence," you should avoid writing programs for which correctness depends upon the timely finalization of objects. For example, if a finalizer of an unreferenced object releases a resource that is needed again later by the program, the resource will not be made available until after the garbage collector has run the object finalizer. If the program needs the resource before the garbage collector has gotten around to finalizing the unreferenced object, the program is out of luck.
So, simply put the process in the Object.finalize() is not safe.
I can think of putting the process in finally statement block in a logic block.
Do you have any other good ideas to achieve this requirement?

No comments:

Total Pageviews

my favorite topics (labels)

_fuxi (302) _misLabel (13) _orig? (3) _rm (2) _vague (2) clarified (58) cpp (39) cpp_const (22) cpp_real (76) cpp/java/c# (101) cppBig4 (54) cppSmartPtr (35) cppSTL (33) cppSTL_itr (27) cppSTL_real (26) cppTemplate (28) creditMkt (14) db (65) db_sybase (43) deepUnder (31) dotnet (20) ECN (27) econ/bank` (36) fin/sys_misc (43) finGreek (34) finReal (45) finRisk (30) finTechDesign (46) finTechMisc (32) finVol (66) FixedIncom (28) fMath (7) fMathOption (33) fMathStoch (67) forex (39) gr8IV_Q (46) GTD_skill (15) GUI_event (30) inMemDB (42) intuit_math (41) intuitFinance (57) javaMisc (68) javaServerSide (13) lambda/delegate (22) marketData (28) math (10) mathStat (55) memIssue (8) memMgmt (66) metaProgram` (6) OO_Design (84) original_content (749) polymorphic/vptr (40) productive (21) ptr/ref (48) py (28) reflect (8) script`/unix (82) socket/stream (39) subquery/join (30) subvert (13) swing/wpf (9) sysProgram` (16) thread (164) thread_CAS (15) thread_cpp (28) Thread* (22) timeSaver (80) transactional (23) tune (24) tuneDB (40) tuneLatency (30) z_ajax (9) z_algoDataStruct (41) z_arch (26) z_arch_job (27) z_automateTest (17) z_autoTrad` (19) z_bestPractice (39) z_bold (83) z_bondMath (35) z_book (18) z_boost (19) z_byRef^Val (32) z_c#GUI (43) z_c#misc (80) z_cast/convert (28) z_container (67) z_cStr/arr (39) z_Favorite* (8) z_FIX (15) z_forex (48) z_fwd_Deal (18) z_gz=job (33) z_gzBig20 (13) z_gzMgr (13) z_gzPain (20) z_gzThreat (19) z_hib (19) z_IDE (52) z_ikm (5) z_IR_misc (36) z_IRS (26) z_javaWeb (28) z_jdbc (10) z_jobFinTech (46) z_jobHunt (20) z_jobRealXp (10) z_jobStrength (15) z_jobUS^asia (27) z_letter (42) z_linq (10) z_memberHid` (11) z_MOM (54) z_nestedClass (5) z_oq (24) z_PCP (12) z_pearl (1) z_php (20) z_prodSupport (7) z_py (31) z_quant (14) z_regex (8) z_rv (38) z_skillist (48) z_slic`Problem (6) z_SOA (14) z_spring (25) z_src_code (8) z_swingMisc (50) z_swingTable (26) z_unpublish (2) z_VBA/Excel (8) z_windoz (17) z_wpfCommand (9)

About Me

New York (Time Square), NY, United States