首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java SoftReference,迎合GC和GC行为

Java SoftReference,迎合GC和GC行为
EN

Stack Overflow用户
提问于 2011-10-15 13:35:34
回答 3查看 693关注 0票数 1

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

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

javadoc甚至说SoftReference对内存感知缓存很好,但是对于JVM实现应该如何处理SoftReference没有严格的规则,我只谈论JVM的Oracle实现(Version6.22和Version 7)。

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

  1. JVM是否考虑了对象的最后一次访问,并且只删除了旧的对象?Javadoc状态:Virtual machine implementations are, however, encouraged to bias against clearing recently-created or recently-used soft references.
  2. 当记忆变紧时会发生什么?JVM惊慌失措,只吃了所有的东西?
  3. 是否有一个参数可以告诉JVM,为了生存(没有OOME)和健康生活(而不是让CPU只运行GC),只吃那么多东西?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-15 14:02:33

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

但是,软引用所发生的情况是,总是保证在出现内存不足异常之前释放它们。除非你有确凿的证据指向他们。

但你应该意识到,你可能会试图访问它们,而它们却不见了。我猜垃圾收集器只会吃掉第一个适合操作所需数量的软引用。

票数 1
EN

Stack Overflow用户

发布于 2011-10-15 17:11:16

虽然SoftReferences是一个很酷的特性,但我个人不敢在大型项目中使用它们,因为我不知道其他组件的内存需求。占用内存的SoftReference缓存会使其他部分表现糟糕吗?

我不使用SoftReferences,而是考虑使用EHCache。让我们按照条目的数量限制特定缓存的大小,或者更好地限制内存中使用的字节(这是即将发布的2.5版本中的一个新特性)。当然,可以配置不同的驱逐策略,例如LRU。您可以使用EHCache配置很多东西。

如果您正在使用Spring,那么版本3.1还将为您提供一些很好的@Cachable方法级注释;EHCache可以在那里用作缓存实现。

票数 0
EN

Stack Overflow用户

发布于 2011-10-15 17:11:37

当记忆变紧时会发生什么?JVM惊慌失措,只吃了所有的对象?

我知道,对于Oracle1.6JVM来说,情况并非如此。我知道一种情况,即处理并发请求的服务器使用响应,其中包含软引用中的实际数据。我注意到,当一个线程报告低内存情况时,其他线程的软引用继续保留其内容(引用对象)。

是否有一个参数可以告诉JVM为了生存(没有OOME)和健康生活(而不是让CPU只运行GC),只吃那么多东西?

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7778127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档