我想緩存在我記憶中的應用產生的數據寫入高速緩存,但是如果內存變得稀缺,我想將數據交換到磁盤。如何實現數據交換到磁盤,只有當可用內存低
理想我希望通過VM通知,它需要的內存和我的數據寫入磁盤並釋放一些內存的方式。但我沒有看到任何方式對自己掛接到虛擬機中,通知我的方式之前發生的OutOfMemoryError
某處(最有可能以任何方式不相關的緩存代碼)。
java.lang.ref
中的引用類在這種情況下似乎沒有任何用處,它們的通知機制(ReferenceQueue
)僅在引用已被GC回收後觸發。那麼將數據保存到磁盤就太晚了。
有什麼替代方法可以有效地管理堆內存? (不交換到磁盤,直到絕對不可避免的)
EDIT1:針對註釋「操作系統已經這樣做,對你」 - 這僅覆蓋了問題的一部分 - 的內存OS量可以分配是有限的資源。也有這裏需要考慮的其他限制比可用內存量的OS:
- 通過虛擬機的架構所施加的限制(
32-Bit VM
) - 可以分配到的內存限制虛擬機的過程(
32-Bit OS
) - 的限制可能使用
-Xmx
選項
只需無限堆大小運行虛擬機不會阻止其運行內存,即使實行虛擬機上的操作系統仍然有充足的可用性,由於以上原因,VM可能無法使用。
大多數操作系統都爲您處理。你爲什麼希望重新實現它? –
並強化上述評論:http://en.wikipedia.org/wiki/Paging – jweyrich
@George通常,您不會選擇進入磁盤或不進行任何操作。你可能有一些你不想經常訪問的任務關鍵數據,你不想從虛擬內存中加載,但是操作系統決定把它放在那裏。 – corsiKa