我正在使用具有全局缓存并且我们也有数据发布者的应用程序。问题是我们经常面临内存不足的问题。现在做了一些调整,但这还不够。我们有大量的年轻代和终身代对象。大多数情况下,应用程序都会进入终身代,因此会抛出 OutOfMemoryError。
由于我们有 2 个 CPU 主机,我们可以应用吞吐量收集器来避免暂停时间,但它主要收集年轻代,因此我们使用并发低暂停收集器。
为此应用程序调整 VM 的最佳方法是什么?
我怎样才能增加 Minor GC,这反过来又会控制我们的终身代。
提前致谢。
我正在使用具有全局缓存并且我们也有数据发布者的应用程序。问题是我们经常面临内存不足的问题。现在做了一些调整,但这还不够。我们有大量的年轻代和终身代对象。大多数情况下,应用程序都会进入终身代,因此会抛出 OutOfMemoryError。
由于我们有 2 个 CPU 主机,我们可以应用吞吐量收集器来避免暂停时间,但它主要收集年轻代,因此我们使用并发低暂停收集器。
为此应用程序调整 VM 的最佳方法是什么?
我怎样才能增加 Minor GC,这反过来又会控制我们的终身代。
提前致谢。
我的第一个想法是使用 WeakHashMap,但后来我发现了这篇文章:WeakHashMap is not a cache。请参阅该文章中的链接,也许您还会发现apache commons合适。
在我看来,最好的做法是不要实现自己的缓存,特别是如果它是一个中心且重要的组件。最好使用图书馆。否则,您将始终必须“调整”您的实施,并且仍然会一遍又一遍地出现新问题。因此,即使您的应用程序中已经有自定义缓存,切换到可靠库的努力也可能得到回报。
如果您有缓存,则需要一种机制来不时删除过时的数据。那是您的任务,而不是 vms 任务。
可用的缓存解决方案,如http://java-source.net/open-source/cache-solutions/oscache有不同的策略如何使缓存条目过期,您可以使用并在必要时进行扩展。
编辑:如果(您如何在评论中指出)您无法更改应用程序的代码,您可以向服务器添加更多内存并调整 jvm 允许使用的堆。这不会解决问题,但它可能会减少它出现的频率。