1

我想SoftReference使用尽可能多的内存使用 s 编写缓存,只要它不会变得太低效。

尝试通过计算对象大小或通过获取一些已使用内存的近似值来估计已使用的大小JVM是死胡同。

javadoc 甚至声明s 对内存感知缓存有好处,但是对于实现如何处理sSoftReference没有硬性规定。我只是在谈论(版本 6.22 及更高版本和版本 7)的 Oracle 实现。JVMSoftReferenceJVM

现在我的问题(请随意回答部分,分组或以任何你喜欢的方式):

  1. 是否JVM考虑对象的最后一次访问并且只删除旧的?Javadoc 指出:Virtual machine implementations are, however, encouraged to bias against clearing recently-created or recently-used soft references.
  2. 当记忆变得紧张时会发生什么?JVM恐慌,只是吃掉所有的物体?
  3. 是否有一个参数告诉JVM只吃多少才能生存(没有OOMEs)和健康生活(没有CPU只运行GC
4

3 回答 3

1

我认为没有命令。(我不确定事件的顺序)

但是软引用发生的情况是,始终保证它们会在出现内存不足异常之前被释放。除非您有硬性参考指向它们。

但是您应该知道,您可能会尝试访问它们并且它们已经消失了。我的猜测是垃圾收集器只会吃掉符合操作所需数量的第一个软引用。

于 2011-10-15T14:02:33.390 回答
0

虽然 SoftReferences 是一个很酷的功能,但我个人不敢在我不知道其他所有组件的内存需求的大型项目中使用它们。占用内存的 SoftReference 缓存是否会使其他部分表现不佳?

我不会使用 SoftReferences 我会考虑使用EHCache。它让您可以根据条目数限制特定缓存的大小,甚至更好的是,内存中使用的字节数(这是即将发布的 2.5 版中的新功能)。当然,可以配置不同的驱逐策略,例如 LRU。您可以使用 EHCache 配置很多内容。

如果您使用的是 Spring,那么 3.1 版还将为您提供一些不错的 @Cachable 方法级注解;EHCache 可以用作那里的缓存实现。

于 2011-10-15T17:11:16.903 回答
0

当记忆变得紧张时会发生什么?JVM 恐慌并吃掉所有对象?

我知道,对于 Oracle 1.6 JVM,情况并非如此。我知道处理并发请求的服务器使用包含软引用中实际数据的响应的情况。我观察到,当一个线程报告内存不足的情况时,其他线程的软引用会继续保留它们的内容(被引用的对象)。

是否有一个参数告诉 JVM 只吃多少才能生存(没有 OOME)和健康地生活(没有 CPU 只运行 GC)

什么足以生存?您的意思是,如果需要 X 数量的内存,那么只回收软引用直到 X 可用?我没有找到任何这样的调整参数,但正如我所说的,当它需要回收一个软引用时,JVM 似乎并没有回收所有软引用。

于 2011-10-15T17:11:37.450 回答