2014-01-17 60 views
0

當Objects處於方法的局部範圍時,我們應該在finally塊中引用Object爲null嗎?通過這樣做解決了哪些性能問題?我們應該在finally塊中分配本地對象引用爲null嗎?

代碼

Map<String, Map<String, String>> getData(Map<String, String> params) { 
    StringBuilder query = new StringBuilder(); // Construct query using it 
    ResultSet rs = null; 
    try { 
     rs = DataUtil.getData(query); 
     while(rs.next) { 
      // store data in return Map 
     } 
    } catch(ConnectionException ce){ 
     ce.printStackTrace(); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } finally { 
     rs = null; 
     query = null; 
    } 
} 

這裏,騰出rsquery似乎沒有實現目的,他們是方法執行後垃圾回收自動有效。任何幫助都會很好。

+1

你的對象的範圍是本地的...我不認爲它有任何區別...他們將準備好GC,只要你離開塊... – TheLostMind

+5

它會讓你的代碼更難以閱讀性能沒有正面的區別。所以... – Kayaman

+1

你說得對。設置本地聲明的引用變量爲null最終不會添加任何東西到性能或幫助垃圾回收AFAIK –

回答

1

有優勢情況下,這種能夠決定的事情不少:它可以使的區別運行程序和OutOfMemoryException。考慮以下代碼:

long[] hugeAry = new long[Integer.MAX_VALUE]; // barely fits on the heap 
... work on hugeAry; 
hugeAry = null; 
int[] intHugeAry = new int[Integer.MAX_VALUE]; 
... work on this one 

註釋掉hugeAry = null很容易導致OOME。這些案例可能會比這個—檢查出this related topic on SO更奇怪。

但是,不要誤會我的意思:在99.9%的情況下,清除當地人(finally或其他)並不重要。

+0

感謝Marko Topolnik!OOME是日常行爲中面臨的最具破壞性的問題。 –

1

不,我們不應該。它使代碼難以閱讀,並且在大多數情況下(例如,您的示例)它絕對沒有任何內容,因爲GC將在範圍之後啓動。

一般來說,我們應該讓Java處理它的垃圾收集,並且不應該試圖通過編寫奇怪的代碼來提高效率。

1

有沒有必要這樣做。根本沒有好處。一旦執行超出該方法,局部變量將無法訪問。 GC將在所有無法訪問的對象上完成。這不是與性能問題有關的地方。

1

不要這樣做,因爲當對象超出範圍時它不代表什麼。所有java對象的重新分配將由垃圾收集器自動處理當沒有所有者或參考到堆中的該對象。

最後是非常方便的,因爲無論您的代碼中是否出現異常,它都會得到執行。使用終於當你想進行一些重要的資源管理工作就像關閉已打開的數據庫連接等HTH

相關問題