对于堆上的java缓存来说,有多少数据太多了?我应该什么时候开始考虑堆外缓存



对于像ehcache这样的堆上缓存来说,有多少数据太多了?

我得到了一个24GB的RAM服务器。我可能一开始会将2-4GB用于缓存,但最终可能会将20GB左右用于缓存。在什么时候我应该担心堆上缓存的GC会花费太长时间?

顺便问一下,DirectMemory是唯一可用的开源堆外缓存吗?黄金时段准备好了吗?

取决于JVM,尤其是使用的GC。尤其是较老的GC并不能真正处理真正大的堆,但解决这一问题的努力越来越多。

例如,Azul系统销售的硬件具有数百GB的堆,由于其特殊的gc,所以没有问题(即gc在ms而不是半分钟内暂停),因此它本身没有Java的限制。不过,不知道随着时间的推移,hotspot/IBM有多好。但24gb的堆并没有那么大——G1可能在那里做得足够好。

在什么时候我应该担心堆上缓存的GC会花费太长时间?

多长太长了?

说真的,如果你正在运行一个"吞吐量"垃圾收集器,这会给你带来太长的暂停,那么你应该尝试切换到低暂停收集器;例如CMS或G1。

大型缓存的主要问题是GC时间过长。为了给你一个想法,它可能是每GB 1秒(这因应用程序而异)如果你有一个20 GB的缓存,并且你的应用程序每隔20秒就会暂停一次,这可以接受吗?

作为一个直接和内存映射文件的爱好者,我倾向于考虑什么时候不把数据从堆中放出来,而只是为了简单起见使用堆。)无论大小,内存映射文件对GC的完整时间几乎没有影响。

使用内存映射文件的优点之一是,它可以比物理内存大得多,而且性能仍然相当好。这让操作系统决定哪些部分应该在内存中,哪些部分需要刷新到磁盘。

BTW:拥有更快的SSD也有帮助;)较大的驱动器也往往更快。检查他们可以执行的IOP。

在本例中,我在一台16GB的机器上创建了一个8TB的文件内存映射。http://vanillajava.blogspot.com/2011/12/using-memory-mapped-file-for-huge.html

请注意,它在80 GB文件中的性能更好。例如,8 TB可能会过高。)

最新更新