2013-08-01 62 views
8

很多時候,我遇到了這樣的聲明,即應用程序應始終明確地關閉它打開的所有資源。關閉資源總是很重要嗎?

我的編程方法比較實用,我不喜歡盲目地遵循任何我沒有明確看到的好處。因此我的問題。

讓我們假設:

  1. 我有一個小的應用程序
  2. 它開闢一些資源(例如文件,數據庫連接,遠程流),並對其進行處理
  3. 它的工作幾分鐘,然後它退出
  4. 比方說,這是一個Java(如果語言是相關的)

難道我真的關心CL收取我打開的所有資源?我想所有打開的資源都將在應用程序/虛擬機退出時關閉/釋放。我對嗎?

如果這是真的,是否有任何令人信服的理由關心在如此短小的工作應用程序中關閉資源?

UPDATE:

問題純屬假設,但對於不關心有關的說法是,我可能只是黑客一起一些快速的腳本,不想寫任何不必要的代碼沒有直接關係到手邊的問題:關閉資源,做所有這些詳盡的try-catch-finally的東西,處理我不在乎的異常等。

問題的關鍵在於是否有任何實際後果不這樣做。

+5

讓我回答一個問題給你:你爲什麼不**關心關閉資源? –

+1

「猜測當應用程序/虛擬機退出時,我打開的所有資源都將被關閉/釋放。」 - >我的猜測是這不是真的。如果您不關閉並且VM退出,則操作系統可能負責關閉這些流/套接字。 – kosa

+3

爲了擺脫警告,你必須禁止它們,它和.close()一樣多。這也是很好的形式。 –

回答

9

我想所有打開的資源將在應用程序/虛擬機退出時關閉/釋放。

如果資源未經過regurarly發佈,會發生什麼情況,您無法控制。它可能沒有傷害,或者它可能會做一些。它也是高度依賴於平臺的,所以只有一個測試不會有幫助。

爲什麼我應該關心在如此短小的工作應用程序中關閉這些資源?

應用程序的大小應該沒有關係。首先,應用程序通常增長;其次,如果你沒有以正確的方式練習,那麼在重要時你就不會知道如何去做。

+1

資源閉合需要大量的練習,因爲它是[真正棘手](http://illegalargumentexception.blogspot.de/2008/10/java-how-not-to-make-mess-of-stream.html) – zapl

+0

@ zapl感謝您的好鏈接! –

2

簡答 - 是的。首先,這是嚴酷的編碼習慣,就像在生活中的其他任何領域一樣,不要自行清理。另一方面,你無法預測操作系統是否會認識到java環境不再需要這些資源,並且最終可能鎖定文件/ etc,這些文件/ etc不能在沒有強制重啓的情況下發布。

總是要清理你打開的任何資源!

有關更新到原始問題的更新 - 添加try/catch塊以關閉任何打開的資源需要5秒鐘,並且可以防止您必須花5分鐘重新啓動計算機。這樣做總是可以節省時間。我的父親總是告訴我,真正的懶惰人第一次做正確的事情,所以他們不必再回來再做。我只是說不要懶惰,做正確的事。寫入catch塊需要5秒鐘的時間永遠不會顯着減慢寫入過程......不寫入5秒可以大大減緩調試速度。

+1

「就像它在生活中的其他任何領域都不能自己清理一樣」,說得好! –

+2

謝謝,你提出了一些好的觀點。我真的不那麼懶。我在我的代碼中關閉了資源。只是我不喜歡公理和做事,「因爲每個人都這樣做」。這就是我故意制定這樣一個有爭議的問題的原因。這不僅僅是你提到的5秒,我不喜歡Java中需要的冗長但相當難看的代碼。我們肯定需要切換到引入試用資源的Java7。 –

+0

我還沒有玩過Java 7中新的「嘗試使用資源」功能,但我同意你的看法:) – StormeHawke

5

如果您不關閉資源,這可能會導致應用服務器頻繁重新啓動時occurs.because操作系統資源枯竭和服務器 應用程序通常有資源

的上限限制根據docs

典型的Java應用程序操縱多種類型的資源,如 文件,流,套接字和數據庫連接。這些資源必須非常小心地處理,因爲它們獲取系統資源eir operations.Thus,因此,你需要確保他們即使在出現錯誤時也能被釋放。

事實上,不正確的資源管理是失敗的 生產應用程序的常見來源,與通常的缺陷是數據庫連接 和文件描述符發生異常後 別的某處其餘開業代碼。這導致應用程序服務器頻繁地在發生資源耗盡時重新啓動,因爲操作系統和服務器通常對資源具有上限限制。

try-with-resources聲明在Java 7中引入了誰不喜歡接近語句的程序員。

+1

+1關於'try-with-resources'的好建議。被困在Java 5的黑暗時代,我不知道它的存在。 – splungebob