19
A
回答
15
假設Class.getResourceAsStream()
將始終返回一個指向您類的JAR文件內的文件的流。這是不正確的。您的類路徑也可能包含文件夾,在這種情況下,Class.getResourceAsStream()
將返回FileInputStream
。某些其他類加載器也可能會返回其他類型的資源,例如遠程文件(在URLClassLoader的情況下)。
即使在JAR文件的情況下,實現也可能會將JAR文件中的持久視圖維護到正在訪問的文件的壓縮字節。也許它是持有內存映射ByteBuffer
...
爲什麼要抓住機會?你應該總是關閉流(和任何其他可關閉的,真實的),不管它們是如何給你的。
至於檢測泄漏,最好的策略是在VM關閉時獲得內存轉儲,然後用某種工具對其進行分析。兩種流行的工具是jhat和Eclipse mat。
4
返回的類型是一個輸入流,因此,無論具體實現(可能會從版本更改爲版本),都有一個應該調用imho的close()方法。
無論該方法是否真的在用當前版本做一些有用的事情。
5
作爲一個經驗法則,您應該關閉所有流(以及其他提供關閉功能的其他類型)。它可能會導致資源泄漏(內存是一種資源)。
雖然自動垃圾回收最終會在不再引用對象時回收內存,但仍可能保留可能不會釋放的本機資源。另外,如果其他長生命期的對象(例如類加載器)持續保留資源,它將不會被垃圾回收器聲明。
如果您的程序壽命短,或者您只打開少量資源,您可能不會遇到問題,但在長時間運行的應用程序中很難檢測到資源泄漏。
相關問題
- 1. WebSockets應該關閉嗎?
- 2. 我應該關閉cURL嗎?
- 3. innoDB - 我應該關閉innodb_flush_log_at_trx_commit嗎?
- 4. 應該關閉YamlConfiguration對象嗎?
- 5. 你應該總是關閉連接嗎?
- 6. 我應該關閉servlet輸出流嗎?
- 7. 遠程PowerShell會話應該關閉嗎?
- 8. 應該關閉來自ReliableSqlConnection的SQLConnection嗎?
- 9. 對話框應該自動關閉嗎?
- 10. 會話和工廠應該關閉嗎?
- 11. 關閉主機之前,我應該關閉lxc容器嗎?
- 12. 關閉Socket還是應該關閉流?
- 13. 我應該關閉的org.apache.commons.io.IOUtils
- 14. 我應該關注木偶控制器的關閉嗎?
- 15. 我應該關閉關於廢棄GitHub項目的問題嗎?
- 16. 在應用程序退出之前,socketpair端應該關閉嗎?
- 17. java.util.concurrent.ExecutorService應該以java.sql.Connection的形式關閉嗎?
- 18. 我應該在收到304後關閉代理連接嗎?
- 19. 退出IntentService時應該關閉遊標嗎?
- 20. 我應該在Python中顯式關閉zeromq套接字嗎?
- 21. 我應該明確關閉RethinkDB連接嗎?
- 22. PHP - 我應該在magic qotes關閉時清理字符串嗎?
- 23. EasyMock:我應該關閉捕獲的InputStream嗎?
- 24. 本教程Notepadv3應該關閉它的數據庫嗎?
- 25. 我應該關閉本地數據庫遊標嗎?
- 26. 我應該關閉實體框架中的延遲加載嗎?
- 27. 關閉後我應該手動處理插座嗎?
- 28. 完成使用後不應該關閉FileStream實例嗎?
- 29. 我應該避免創建JavaScript關閉嗎?
- 30. 我應該關閉方法調用之間的mySQL連接嗎?