2011-12-18 52 views
3

我有一個程序爲目錄(子)樹中的每個文件創建一個對象。在大型和大型磁盤的這些日子裏,沒有辦法知道將會有多少文件,尤其是,而不是幾年(幾個月)。檢測OutOfMemory的異常情況

我的程序不是企業關鍵的;它是用戶分析該子樹的工具。因此,告訴用戶在該環境中沒有足夠的內存來操作該子樹是可以接受的。他可以通過選擇該子樹的子樹來做他想做的事情。

但是程序不能接受只死或堆棧跟蹤或其他只有程序員可以愛的東西。我希望該計劃能夠向用戶提供一些合理的反饋意見,並讓他控制他所做的工作。

我已經閱讀了StackOverflow關於OOM異常的一些帖子,並且在主要內容中我同意了許多觀點:設計不當的應用程序,內存泄漏等等,都是需要考慮的問題。 。但在這種情況下,我可能有人試圖在10T磁盤上使用我的工具,該磁盤只有比準備分析的程序更多的文件。而且我並沒有試圖編寫這個工具,因此它可以在任何可能的子樹上運行。

我曾經看到有人認爲OOM可以像「其他異常」一樣被捕獲;不幸的是,這不是一個強有力的做事方式。當OOM被拋出時,一些線程可能已經死亡,我們無法確定它會是哪一個線程,我們無法重新啓動它。因此,例如,如果它碰巧是Swing的關鍵之一,那麼我們運氣不好。

所以我現在的想法是,我的程序需要偶爾看起來(至少)的可用內存的可用量,並停止自己,如果低於某個閾值。我可以測試一些事情來確定一個閾值,允許我輸出一個帶有消息的對話框,然後將所有對我的對象的引用擦除。

但是,如果我錯過了某些東西,或者有更好的方法去解決問題,我想知道它。

+1

我會親自使用像lucene這樣的東西,並將文件系統索引到磁盤。我沒有理由認爲它應該在記憶中。另外,如果你確實需要一個龐大的內存索引,那就是你需要的,你需要相應地分配堆 – aishwarya 2011-12-18 04:17:53

+0

@aishwarya:在閱讀問題時我想到了同樣的事情。 +1 – DaveFar 2011-12-18 08:35:36

+1

檢查可用內存的問題是它只顯示已知的可用內存,而不會在GC運行時釋放多少內存。這意味着,只要GC運行時有大量內存可用,您可能會停止在低內存上進行處理。這可以接受嗎? – 2011-12-18 10:21:30

回答

1

看到我的帖子here。爲什麼在你填充樹時不計算freeMemory,並停在某些(可能是用戶可配置的)點上,例如:佔用了90%的堆。您應該儘量保持爲每個文件創建的對象儘可能小。你可以粘貼這個數據結構的代碼,這樣我們可以批評它,看看它是否可以做得更小?也許你不需要直接擁有一個對象,而是一個可以根據請求獲取相關信息的代理對象。

+0

@DaveBall - 乾杯。 – 2011-12-18 08:45:40

1

這裏有沒有直接回答,只是我的2什麼辦法我反而採取美分:

這樣一個程序(或API)的用戶,我很高興能得到反饋/估計/儘早,例如控制:

  • 得到一個警告,如「有42個fantastillion許多文件在指定目錄下,這將需要大約5個小時的處理和2GB內存」
  • 是能夠設置最大數量的文件(也許用過濾器來獲得最相關的文件),或者遍歷子樹的最大遞歸深度
  • 讓程序通過目錄結構進行廣度優先搜索(而不是深度優先搜索),並且在太大的目錄允許用戶選擇中止分析,或者忽略當前目錄,或者忽略當前子樹。

我也能接受等待一段時間的預處理,如果我得到了適當的反饋,如「預處理:遍歷子目錄估算所需的時間和記憶」,並估算好之後。

通過合理的估計,我認爲您不需要複雜的內存使用情況監視。如果OOM異常仍然很少出現,我寧願遵循aishwarya的方法並寫入磁盤,而不是將所有信息保存在內存中。