Java在OutOfMemoryError之前清空缓存

时间:2013-01-07 09:48:41

标签: java caching memory-management garbage-collection jvm

在内存已满之前是否有可靠的方法清空缓存? 或者甚至根据当前可用的“实际”可用内存(硬引用对象)更好地限制缓存?

由于高GC惩罚,软引用缓存不是一个好主意,一旦达到限制,所有缓存条目都需要重新加载。

同样,值runtime.freeMemory()对我来说并不可靠,因为即使它太低,在下一个GC循环之后也可能有足够的可用空间,因此它不是实际使用内存的良好指示。

我试图弄清楚每个原始时间会消耗多少内存,所以我会知道缓存的实际内存使用情况并对其进行限制,但无法找到一种可靠的方法来计算出多少内存用于存储大小为n的String引用。

3 个答案:

答案 0 :(得分:2)

有两个或三个收藏。如果您希望降级服务具有内存可用性,则可以使用。

  • 最近参赛作品的地图,例如LinkedHashMap的。
  • 软参考地图。
  • 弱引用的地图。

您可以控制每个映射应该有多大,并且知道在次要集合之后可以清除弱引用,如果需要,将清除软引用,并且强引用映射具有将始终保留的核心数据。 / p> BTW:如果您经常达到内存限制,则应考虑购买更多内存,每个JVM最多约32 GB。您可以以低于200美元的价格购买32 GB。

答案 1 :(得分:2)

尝试最新的Oracle 1.7版本之一。他们应该提供GarbageCollectorMXBean和GarbageCollectionNotificationInfo。用于监视每个GC循环后使用/未使用的内存量。有一些示例代码here。 然后,您可以使用Peter建议的多级缓存在内存紧张时清除外层,但保留较小的第一级缓存。

答案 2 :(得分:1)

我建议最简单的解决方案是更改对弱引用的引用。 这样,当所有强引用都超出范围时,引用仍然可以最终确定并收集垃圾。

请参阅:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ref/WeakReference.html