java Collection 造成Out of memory?

除了java.sql.ResultSet以外還有另一個物件組也很容易造成VM把記憶體佔用而不釋放出來,

Collection,包含List、ArrayList、Map、Stack、Vector…等等等,在使用這些物件時,

一般狀況下不使用時,VM應該會自動回收,不過經過實驗,當Collection內含複雜內容,

像Map裡包含ArrayList,而ArrayList又包含Stack….等等,當不在使用Map時,其內容並不會被釋放,

所以需要在不使用Collection把內容給clear掉,可以呼叫clear()事件,Collection所佔用的記憶體其實並沒有很大,

所以如果小程式並不會有感覺,可是一放到流量大的Web Server,如tomcat時,很容易就被塞爆記憶體,

形成out of memory,有out of memory時,加上-Xmx數字m,並無法解決問題時,可以檢查看看Collection的使用。

ps.StringBuffer也會有此種狀況產生,故在使用完StringBuffer後記得要利用setLength(1);讓記憶體放出。




java.sql.ResultSet absolute造成out of memory

java.sql.ResultSet 使用absolute方法可以移動ResultSet的指標到想要的筆數,

當 JDBC跟資料庫要資料時,會回傳一個ResultSet,但不是把所有查詢的結果均回傳至Web Server端,

而是只給前面幾筆資料,可以利用ResultSet的方法setFetchSize來設定一次回傳的筆數,

(一次傳的多,等待的時間就比較長,傳的太少,要一直跟資料庫要ResultSet.next()也會比較慢)

當ResultSet向下移動碰觸或是快要碰觸到目前回傳的筆數時,會自動再跟資料庫要設定好的筆數,

而把目前筆數以上的資料全都暫存在記憶體裡。

以上是ResulSet的基本原理,當一次查詢的量夠大時,而利用absolute來移動到想要的Row時,

就有可能發生out of memory的問題,

舉個列子:

更多內容 java.sql.ResultSet absolute造成out of memory