2010-12-20 23 views
0

如何等待垃圾回收器而不是由JVM拋出OutOfMemoryError?是否有一些設置JVM或其他選項(如代碼實踐)?如何配置JVM等待而不是拋出OutOfMemoryError

我不想入侵JVM內存設置或調優GC - 只等待沒有OutOfMemoryError的GC因爲我知道沒有內存泄漏,只是垃圾阻止了新分配。

回答

4

恐怕你的問題沒有多大意義。

OutOfMemoryException通常在之後GC已經運行並且在回收足夠的內存方面沒有成功。等待GC再次運行不太可能有所幫助。如果它沒有幫助,結果是你的應用程序將凍結。

此外,沒有辦法做到這一點。

3

您可以調整JVM何時放棄並拋出OOM的閾值,但這是JVM在檢測到垃圾回收沒有完成任何事情時所做的設計。請注意,由於時序不正確或僅僅因爲您創建了很多對象,JVM不會拋出OOM。它會檢測到它已經重複運行GC並且GC沒有釋放任何大量的內存。

一些可能性:

  1. 您正在使用大量的內存永久的基礎上。這不一定是內存泄漏,也許你只是加載一些大數據,並沒有意識到內存有多大。
  2. 你有內存泄漏,或者你更喜歡「以意想不到的方式使用內存」。 Java提供了很多容易丟失內存的地方。我被JSON庫中的ThreadLocal緩存所殺,並且在適當的時候無法調用新的String(字符串)。
  3. 臨時數據漂流到PermGen中,因爲它並不是臨時性的。
  4. 您沒有任何大問題,但是您正在爲您分配的內存量推送信封,而您沒有正確調整。打開併發標記清除垃圾收集器,打開GC日誌記錄,並查看行爲是否與您對應用程序的期望相符。

最後,運行一個分析器來查看您正在使用的內存。任何程序的第一次迭代幾乎總是有非常低的成果來清理。