簡體   English   中英

檢測Java中的內存不足?

[英]Detect low memory in Java?

為了防止OutOfMemoryError我想創建一個代碼,在有可能超出可用RAM的危險時清除程序中的某些緩存。

當內存與最大可用內存有一定百分比時,如何從代碼內部進行檢測?

檢測Java中的內存消耗以對您的代碼做出反應不是一個好主意。 您永遠不會知道垃圾收集器的行為,何時啟動以及何時可以釋放多少內存,……

如果要防止對對象的引用阻止垃圾回收器將其刪除,則可以使用WeakReference(java.lang.ref)。 但是,如果實現了緩存,則可能會使緩存無用,因為緩存的對象可能會非常快速且經常地被刪除。

我建議使用LRU緩存。 這樣的高速緩存具有一定的容量。 如果超出了此容量,則最近最少使用的元素將被踢出緩存。 這樣可以簡單地防止緩存無限增長。

如果您使用google可以找到一些簡單的實現:

public class LRUMap<K, V>  extends LinkedHashMap<K, V> {
    private static final long serialVersionUID = 1L;
    private final int capacity;

    public LRUMap(final int capacity) {
        this.capacity = capacity;
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        return size() > capacity;
    }
}

如果您需要更多,我將檢查現有的緩存實現。 它們可能支持其他配置功能,例如e。 G.緩存條目的最大年齡。

事實證明(令我驚訝的是),有一種半可靠的方法可以檢測超出預設閾值的內存使用情況。

MemoryPoolMXBean類提供了一種在內存池上設置使用率閾值的方法,並在池的使用率超過閾值時獲得通知。

您可以通過調用ManagementFactory.getMemoryPoolMXBeans()獲得JVM的內存MXBean實例。

閾值有兩種,為了正確使用它們,您需要了解它們之間的區別。 這很復雜:請參考javadoc

還應注意,規范:

  • 說不是所有的空間都支持閾值檢查,
  • 說何時對以下閾值交叉進行測試沒有任何限制:

    “ Java虛擬機在其最佳合適的時間基於內存池執行使用率閾值交叉檢查……”

  • 說明了如何測試是否支持閾值檢查以及如何注冊通知。

暫無
暫無

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

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