2012-09-14 45 views
0

我遇到了一種情況,我想要存儲空間數據的內存緩存,這不是立即需要的,也不是從磁盤加載,而是通過算法生成的。由於數據是空間訪問的,因此將根據不相關因素以及距最近讀取操作位置的距離從緩存中刪除數據。問題是Java的垃圾收集似乎並沒有很好地與這個系統集成。我想使用數據的空間知識來使其能夠被JVM垃圾收集。有沒有辦法將這些緩存對象標記爲垃圾回收?如果JVM遇到內存不足異常,是否有辦法捕獲該異常並刪除緩存對象以釋放內存?在Java中緩存大量空間數據 - 是否可行?

或者這是做錯事情的錯誤方式?

+0

難道你不在靜態字段中保留引用嗎?順便說一句。 Guava擁有比'HashMap'更強大的緩存類型。 – zeller

回答

2

有沒有辦法將這些緩存對象標記爲垃圾回收?

最簡單的方法是存儲

  • 一些數據與強引用例如在LinkedHashMap中,可能作爲LRU緩存。
  • 您希望在SoftReferences緩存中儘可能保留的數據。這些將不會立即清理,但會在OOME之前清理。
  • 數據可以在WeakHashMap中以很小的代價被丟棄。該數據在GC執行之前可用。

如果JVM遇到內存外的一個例外,是有辦法捕獲了異常,並刪除緩存對象以釋放內存?

你可以這樣做,但它不是理想的,因爲錯誤可以在任何線程的任何地方拋出。

+0

我只是輸入相同的答案,看一看Access-Order Oriented示例[here](http://blog.mindit.in/?p=8#comment-41),並考慮重寫'removeEldestEntry()'刪除未使用的項目 – GrahamA

+0

我聽說GC在內存不足異常發生之前就運行了,所以WeakHashMap看起來像在這裏工作。 – okw

+0

感謝您指向[java.lang.ref](http://docs.oracle.com/javase/7/docs/api/java/lang/ref/package-summary.html) – okw

相關問題