首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态分配缓存大小缓解HeapSpace错误

动态分配缓存大小缓解HeapSpace错误
EN

Stack Overflow用户
提问于 2010-09-28 22:23:47
回答 2查看 241关注 0票数 0

我们有一个对象的集合,随着时间的推移,它会变得非常大。我们已经实现了一个缓存策略来帮助缓解这个问题,但是我们仍然在运行时耗尽了堆空间-如果在启动时没有分配足够的内存。

有没有一种标准的机制可以在运行时减小缓存的大小来消除这些OutOFMemory错误?这样,如果我们的进程以比正常情况下更小的内存片开始,我们有望避免服务器死机。

我意识到这是一个错误类型,因此不应该被捕获/处理,因为它通常表示更严重的问题。

是不是就像下面这样简单:

代码语言:javascript
复制
private static final long RECOMMENDED_MEMORY = 1073741824L;  //Example 1 Gig
private static int recommendedCacheSize = 100; //Example of 100 items
long heapSize = Runtime.getRuntime().totalMemory();
double size = Math.floor((double) heapSize/RECOMMENDED_MEMORY * recommendedCacheSize);
recommendedCacheSize = ++size; 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-29 01:31:01

为什么不使用被设计成real cache的东西呢

虽然您可以使用软引用来实现内存敏感的缓存,但此类缓存往往会将对象留在内存中太长时间(增加GC负载)。弱引用不适合缓存,因为它们被清除的可能性要高得多(实际上,它们在每次GC时都会被清除)。

票数 0
EN

Stack Overflow用户

发布于 2010-09-28 22:48:08

我怀疑缓存实现没有维护WeakReferenceSoftReference对象的缓存,这些对象通常用在Java对象缓存中。对缓存使用软引用或弱引用非常重要,否则可能会抛出OOME (内存不足错误)。

使用软/弱引用背后的原因是垃圾收集器将尝试收集这些对象,以防没有足够的内存可用。使用强引用(普通对象引用)在缓存中存储对对象的引用,将防止内存被回收。

但是,如果即使在使用弱/软引用时也得到OOME,我怀疑您的GC调优得不够好。您的应用程序似乎遇到了突然的内存消耗,导致了OOME情况。这种情况不太可能发生,但有可能发生,特别是如果前一次调用GC时没有清除足够的内存(这些内存最终会被下一次消费激增所消耗)。

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

https://stackoverflow.com/questions/3813749

复制
相关文章

相似问题

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