应用程序具有全局缓存时使用垃圾收集的最佳实践

时间:2012-04-04 12:14:43

标签: java

我正在使用具有全局缓存的应用程序,我们也有数据发布者。问题是我们经常遇到内存不足的问题。现在做了一些调整,但这还不够。我们有很多年轻一代和终身一代的对象。大部分时间应用程序进入终身生成,因此它会抛出OutOfMemoryError。

由于我们有2个CPU主机,我们可以应用吞吐量收集器以避免暂停时间,但它主要收集年轻代,因此我们使用并发低暂停收集器。

为此应用程序调整VM的最佳方法是什么?

如何增加次要GC,从而控制我们的终身代。

提前致谢。

2 个答案:

答案 0 :(得分:1)

我的第一个想法是使用WeakHashMap,但后来我找到了这篇文章:WeakHashMap is not a cache。请参阅该文章中的链接,也许您会发现apache commons合适。

在我看来,最佳做法是不实现自己的缓存,特别是如果它是一个核心和重要的组件。最好使用库。否则,您将始终必须“调整”您的实施,但仍然会出现新的问题。因此,即使您的应用程序中已经有自定义缓存,切换到可靠库的工作也可能会付出代价。

答案 1 :(得分:0)

如果您有缓存,则需要一种机制来不时删除陈旧数据。这是你的任务而不是vms任务。

可用的缓存解决方案(如http://java-source.net/open-source/cache-solutions/oscache)有不同的策略如何使您可以使用的缓存条目到期并在必要时进行扩展。

编辑:如果(您在评论中如何表示)您无法更改应用程序的代码,您可以向服务器添加更多内存并调整允许使用jvm的堆。这不会解决问题,但可能会减少问题。