对于像 ehcache 这样的堆上缓存来说,多少数据太多了?
我得到一个 24GB RAM 服务器。我可能会开始使用 2-4 GB 进行缓存,但最终可能会使用 20GB 左右的缓存。在什么时候我应该担心堆上缓存的 GC 会花费太长时间?
顺便问一下,DirectMemory 是唯一可用的开源堆外缓存吗?准备好迎接黄金时段了吗?
对于像 ehcache 这样的堆上缓存来说,多少数据太多了?
我得到一个 24GB RAM 服务器。我可能会开始使用 2-4 GB 进行缓存,但最终可能会使用 20GB 左右的缓存。在什么时候我应该担心堆上缓存的 GC 会花费太长时间?
顺便问一下,DirectMemory 是唯一可用的开源堆外缓存吗?准备好迎接黄金时段了吗?
取决于您的 JVM,尤其是使用的 GC。尤其是较旧的 GC 并不能真正处理非常大的堆,但是已经越来越多地努力解决这个问题。
例如,由于其特殊的 GC , Azul 系统销售具有数百 GB 堆的硬件而没有问题(即 gc 在 ms 内暂停而不是半分钟),因此它不受 Java 本身的限制。不知道随着时间的推移热点/IBM有多好。但是无论如何,一个 24gb 的堆并没有那么大 - G1 无论如何应该在那里做得足够好。
在什么时候我应该担心堆上缓存的 GC 会花费太长时间?
多长时间才算过长?
说真的,如果你正在运行一个“吞吐量”的垃圾收集器,这给你带来了太长的暂停,那么你应该尝试切换到一个低暂停的收集器;例如 CMS 或 G1。
大缓存的主要问题是完整的 GC 时间。给你一个想法,它可能是每 GB 1 秒(这因应用程序而异)如果你有一个 20 GB 的缓存并且你的应用程序每隔一段时间就会暂停 20 秒,这是可以接受的吗?
作为直接和内存映射文件的粉丝,我倾向于考虑何时不将数据放在堆外,而为了简单起见只使用堆。;) 无论大小如何,内存映射文件对完整 GC 时间几乎没有影响。
使用内存映射文件的优点之一是它可以比您的物理内存大得多,并且性能仍然相当好。这让操作系统决定哪些部分应该在内存中,哪些需要刷新到磁盘。
顺便说一句:拥有更快的 SSD 也有帮助;)更大的驱动器也往往更快。检查他们可以执行的 IOP。
在这个例子中,我创建了一个 8 TB 的文件内存,映射到一台 16 GB 的机器上。http://vanillajava.blogspot.com/2011/12/using-memory-mapped-file-for-huge.html
请注意,它在 80 GB 文件示例中表现更好,8 TB 可能会过度杀戮。;)