我有一個程序爲目錄(子)樹中的每個文件創建一個對象。在大型和大型磁盤的這些日子裏,沒有辦法知道將會有多少文件,尤其是,而不是幾年(幾個月)。檢測OutOfMemory的異常情況
我的程序不是企業關鍵的;它是用戶分析該子樹的工具。因此,告訴用戶在該環境中沒有足夠的內存來操作該子樹是可以接受的。他可以通過選擇該子樹的子樹來做他想做的事情。
但是程序不能接受只死或堆棧跟蹤或其他只有程序員可以愛的東西。我希望該計劃能夠向用戶提供一些合理的反饋意見,並讓他控制他所做的工作。
我已經閱讀了StackOverflow關於OOM異常的一些帖子,並且在主要內容中我同意了許多觀點:設計不當的應用程序,內存泄漏等等,都是需要考慮的問題。 。但在這種情況下,我可能有人試圖在10T磁盤上使用我的工具,該磁盤只有比準備分析的程序更多的文件。而且我並沒有試圖編寫這個工具,因此它可以在任何可能的子樹上運行。
我曾經看到有人認爲OOM可以像「其他異常」一樣被捕獲;不幸的是,這不是一個強有力的做事方式。當OOM被拋出時,一些線程可能已經死亡,我們無法確定它會是哪一個線程,我們無法重新啓動它。因此,例如,如果它碰巧是Swing的關鍵之一,那麼我們運氣不好。
所以我現在的想法是,我的程序需要偶爾看起來(至少)的可用內存的可用量,並停止自己,如果低於某個閾值。我可以測試一些事情來確定一個閾值,允許我輸出一個帶有消息的對話框,然後將所有對我的對象的引用擦除。
但是,如果我錯過了某些東西,或者有更好的方法去解決問題,我想知道它。
我會親自使用像lucene這樣的東西,並將文件系統索引到磁盤。我沒有理由認爲它應該在記憶中。另外,如果你確實需要一個龐大的內存索引,那就是你需要的,你需要相應地分配堆 – aishwarya 2011-12-18 04:17:53
@aishwarya:在閱讀問題時我想到了同樣的事情。 +1 – DaveFar 2011-12-18 08:35:36
檢查可用內存的問題是它只顯示已知的可用內存,而不會在GC運行時釋放多少內存。這意味着,只要GC運行時有大量內存可用,您可能會停止在低內存上進行處理。這可以接受嗎? – 2011-12-18 10:21:30