天天看點

【hibernate架構】性能優化之session.clear()的運用和Java記憶體洩露問題

注意session.clear()的運用,尤其在不斷分頁循環的時候。

a)在一個大集合中進行周遊,周遊msg,取出其中的含有敏感字樣的對象。

hibernate裡面有一個緩存,是session級的緩存。一張表裡面存了上百萬的商品資訊,我們要取出這些内容并且進行分頁,點選下一頁檢視商品資訊,現在假設在同一個session裡面執行這個操作,這時候就會有問題。session先取50條進來,然後再開一個session,上一個session就會被清除,被清的過程是由java虛拟機的垃圾清除器來完成,什麼時候清除不确定,你可以用手動來清除,利用session.clear()。

如果你隻使用一個session來處理的話,當取50條資訊的時候,接着再讀的時候就會不斷增加,在記憶體裡面的資訊就會越來越多,而且你不去清除它,由于有引用的存在,java虛拟機是不會幫你清除的。記憶體就會越占越多,記憶體就會爆掉。

實際開發中,我們每一個頁面是單獨起的一個session,這個就無所謂了。

但是你在導資料或用資料的時候,用到hibernate了,就可能出現這種錯誤。

應該怎麼做呢?就是處理完50條之後,調用session.clear(),之後再調再取。

b)另外一種形式的記憶體洩露/面試題:java有記憶體洩露嗎?

java有沒有記憶體洩露?在文法級别上沒有,因為不用回收記憶體,會被垃圾回收器回收了,但是你寫程式的時候用到了其中的資源的時候,一定要記得回收。比如說你打開了資料庫的連接配接池,打開了連接配接,你一定要記得關閉,不然的話他就在記憶體裡老開着。比如說你打開了檔案,你必須把他關閉,因為不關閉的話就無法調用本地的資源來關閉檔案。因為打開檔案相當于調了c,c調了windows的api,那麼windows的api裡面c調用的那部分對于c語言來說是需要手動回收記憶體的,如果不關閉檔案它就不會回收。是以是java引起的洩露,但是文法上不是(在實際當中利用的時候會有)。

轉載請注明出處:http://blog.csdn.net/acmman/article/details/43937659