有没有一种可靠的方法可以在内存满之前清空缓存?或者更好地根据当前可用的“实际”空闲内存(硬引用对象)来限制缓存?
软引用缓存不是一个好主意,因为高GC惩罚,一旦命中限制,所有缓存条目都需要重新加载。
此外,对于我来说,值runtime.freeMemory()也不是那么可靠,因为即使它太低,在下一个GC周期之后可能会有大量的空闲空间,因此它不能很好地指示实际使用的内存。
我试图计算出每个基元时间将消耗多少内存,以便了解缓存的实际内存使用情况并对其进行限制,但找不到一种可靠的方法来计算将使用多少内存来存储大小为n的字符串引用。
发布于 2013-01-07 18:00:33
有两个或三个集合。如果你想要有内存可用性的降级服务,你可以选择。
对最新条目进行映射,例如软引用的LinkedHashMap.
您可以控制每个映射的大小,因为您知道弱引用可以在次要收集后清除,软引用将在需要时清除,并且强引用映射具有将始终保留的核心数据。
顺便说一下:如果您经常遇到内存限制,您应该考虑为每个JVM购买更多内存,最高可达32 GB。你可以花不到200美元买到32 GB的内存。
发布于 2013-01-08 01:37:01
尝试较新的Oracle 1.7版本之一。他们应该提供GarbageCollectorMXBean和GarbageCollectionNotificationInfo。使用它在每个GC周期之后监视已使用/未使用的内存量。这里有一些示例代码here。然后,您可以按照Peter的建议使用多级缓存,以便在内存紧张时清除外层缓存,但保留较小的一级缓存。
发布于 2013-01-07 18:05:05
我建议最简单的解决方案是将引用更改为弱引用。这样,当所有强引用都超出范围时,引用仍然可以最终确定并进行垃圾回收。
请参阅:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ref/WeakReference.html
https://stackoverflow.com/questions/14193389
复制相似问题