簡體   English   中英

如何在 java 中釋放手柄

[英]how to free handles in java

在我的程序代碼中有很多線程。 當我的程序開始和結束時,句柄的數量不會被釋放。 當程序第二次啟動時,句柄的數量增加了。 每次都會發生這種情況。 程序的線程數也增加了。 誰能告訴我如何釋放手柄? 因為我的程序中存在句柄泄漏的問題。

您沒有關閉使用這些句柄的流。 任何時候你使用某種 I/O 資源,你都需要確保它是關閉的。 傳統上,這應該在finally塊中完成,以確保無論發生什么都會調用它,例如:

final FileInputStream in = new FileInputStream("C:/test.txt");
try {
    // Do whatever you want with the stream:
    //   - read from it directly
    //   - call other methods etc.
    // Just make sure you're really finished with it
    // by the end of this try block!
}
finally {
    in.close();
}

這同樣適用於數據庫連接、HTTP 連接、各種 URL 資源——幾乎所有使用close()方法的東西。

查看這些實際上是什么類型的句柄(文件/數據庫/網絡端口)和任何詳細信息(例如文件名、遠程主機等)將幫助您跟蹤程序的哪些部分沒有正確關閉它們的資源。


最好先try {... } finally { foo.close(); } try {... } finally { foo.close(); }嵌入到您的編程肌肉記憶中,因為您總是希望像這樣對待資源。 這是防止泄漏的唯一可靠方法,並且應該在第一次編寫代碼時完成,而不是在以后追查錯誤時完成。

除了 Andrzej 所說的:檢查您的自定義對象是否覆蓋了 finalize () 方法。 如果 finalize 方法拋出異常,那么 object 將永遠不會被垃圾收集。

檢查 static collections 的使用情況確實是必需的,一般 static Z0B9ABFE67CC31FCF1ECD022EB19A521 是長壽的。

可能你可以嘗試使用軟引用和弱引用,這樣下次垃圾 collections 發生時,它們引用的對象可能有資格進行垃圾收集。

再次注意:system.gc () 是一個請求,而不是一個強制命令,因此它可能不會產生確切的預期數字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM