2

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

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

此外runtime.freeMemory(),对于我的目的,该值也不是那么可靠,因为即使它太低,在下一个 GC 周期之后可能会有足够的可用空间,因此它不能很好地指示实际使用的内存。

我试图弄清楚每个原始时间会消耗多少内存,因此我会知道缓存的实际内存使用情况并对其进行限制,但找不到可靠的方法来确定将使用多少内存来存储大小为 n 的字符串引用。

4

3 回答 3

2

试试最近的 Oracle 1.7 版本之一。他们应该提供 GarbageCollectorMXBean 和 GarbageCollectionNotificationInfo。使用它来监控每个 GC 周期后已使用/未使用的内存量。这里有一些示例代码。然后,您可以按照 Peter 的建议在内存紧张时使用多级缓存来清除外部级别,但保留较小的一级缓存。

于 2013-01-07T17:37:00.507 回答
2

收藏两三个。如果您想要降低内存可用性的服务,您可以拥有。

  • 最近条目的映射,例如 LinkedHashMap。
  • 软参考地图。
  • 弱引用图。

您可以控制每个映射的大小,因为弱引用可以在次要收集后清除,软引用将在需要时清除,强引用映射具有始终保留的核心数据。

顺便说一句:如果您经常达到内存限制,您应该考虑购买更多内存,每个 JVM 最多约 32 GB。您可以以不到 200 美元的价格购买 32 GB。

于 2013-01-07T10:00:33.460 回答
1

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

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

于 2013-01-07T10:05:04.847 回答