我想使用尽可能多的内存使用SoftReference
编写一个缓存,只要它不会变得太低效。
试图通过计算对象大小或获得JVM
的一些已使用内存近似来估计所使用的大小是死胡同。
javadoc甚至说SoftReference
对内存感知缓存很好,但是对于JVM
实现应该如何处理SoftReference
没有严格的规则,我只谈论JVM
的Oracle实现(Version6.22和Version 7)。
现在,我的问题(请随意回答部分、分组或以任何方式请):
JVM
是否考虑了对象的最后一次访问,并且只删除了旧的对象?Javadoc状态:Virtual machine implementations are, however, encouraged to bias against clearing recently-created or recently-used soft references.
JVM
惊慌失措,只吃了所有的东西?JVM
,为了生存(没有OOME
)和健康生活(而不是让CPU只运行GC
),只吃那么多东西?发布于 2011-10-15 14:02:33
我不认为这是命令。(我不确定事件的顺序)
但是,软引用所发生的情况是,总是保证在出现内存不足异常之前释放它们。除非你有确凿的证据指向他们。
但你应该意识到,你可能会试图访问它们,而它们却不见了。我猜垃圾收集器只会吃掉第一个适合操作所需数量的软引用。
发布于 2011-10-15 17:11:16
虽然SoftReferences是一个很酷的特性,但我个人不敢在大型项目中使用它们,因为我不知道其他组件的内存需求。占用内存的SoftReference缓存会使其他部分表现糟糕吗?
我不使用SoftReferences,而是考虑使用EHCache。让我们按照条目的数量限制特定缓存的大小,或者更好地限制内存中使用的字节(这是即将发布的2.5版本中的一个新特性)。当然,可以配置不同的驱逐策略,例如LRU。您可以使用EHCache配置很多东西。
如果您正在使用Spring,那么版本3.1还将为您提供一些很好的@Cachable方法级注释;EHCache可以在那里用作缓存实现。
发布于 2011-10-15 17:11:37
当记忆变紧时会发生什么?JVM惊慌失措,只吃了所有的对象?
我知道,对于Oracle1.6JVM来说,情况并非如此。我知道一种情况,即处理并发请求的服务器使用响应,其中包含软引用中的实际数据。我注意到,当一个线程报告低内存情况时,其他线程的软引用继续保留其内容(引用对象)。
是否有一个参数可以告诉JVM为了生存(没有OOME)和健康生活(而不是让CPU只运行GC),只吃那么多东西?
什么是足够生存的?您的意思是,如果需要X的内存量,那么只有在X可用之前才回收软引用?我没有找到任何这样的调优参数,但正如我说过的,当JVM需要回收所有软引用时,它似乎并没有回收所有的软引用。
https://stackoverflow.com/questions/7778127
复制相似问题