堆上java缓存有多少数据?什么时候应该开始考虑堆外缓存?

时间:2012-01-20 04:10:20

标签: java caching ehcache directmemory

像ehcache这样的堆上缓存有多少数据?

我正在使用24GB RAM服务器。我可能会开始使用2-4 GB进行缓存,但最终可能会投入20GB左右来缓存。在什么时候我应该担心堆上缓存的GC会花费太长时间?

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

3 个答案:

答案 0 :(得分:3)

取决于您的JVM,尤其是使用过的GC。较老的GC尤其不能真正处理大堆,但是我们正在努力解决这个问题。

例如,Azul系统出售具有数百GB堆的硬件没有问题(即ms中的gc暂停而不是半分钟),这要归功于它们的special GC,所以它本身并不限制Java。不知道热点/ IBM有多好。但是无论如何,一个24gb的堆也不是那么大 - 无论如何G1应该在那里做得足够好。

答案 1 :(得分:2)

  

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

多久太久了?

说真的,如果你正在运行一个“吞吐量”垃圾收集器并且这会让你停顿太长时间,那么你应该尝试切换到一个低暂停收集器;例如CMS或G1。

答案 2 :(得分:2)

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

作为直接和内存映射文件的粉丝,我倾向于考虑何时不将数据从堆中放出,并且为了简单起见只使用堆。 ;)内存映射文件几乎不影响完整的GC时间,无论大小如何。

使用内存映射文件的一个优点是它可以比您的物理内存大得多,并且仍然可以很好地运行。这使操作系统无法确定哪些部分应该在内存中以及哪些部分需要刷新到磁盘。

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

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

注意,它在80 GB文件示例中表现更好,8 TB可能会被过度杀死。 ;)