多少数据对于像ehcache这样的堆缓存来说是太多了?
我得到了一个24‘m的内存服务器。我可能会在开始时投入2-4 GB用于缓存,但最终可能会投入20 GB左右用于缓存。在什么情况下,我应该担心堆上缓存的GC会花费太长时间?
顺便问一下,DirectMemory是唯一可用的开源堆外缓存吗?黄金时间准备好了吗?
发布于 2012-01-20 15:43:30
这取决于您的JVM,尤其是使用的GC。尤其是较老的GC并不能真正处理非常大的堆,但已经有了越来越多的努力来解决这个问题。
例如,由于其special GC,Azul系统销售的硬件具有数百GB的堆而没有问题(即gc在ms内暂停不到半分钟),所以它本身对Java没有限制。不知道随着时间的推移,hotspot/IBM有多好。但是,24 G1的堆无论如何也不是那么大--无论如何,G1在那里可能会做得足够好。
发布于 2012-01-20 15:08:21
在什么时候我应该担心堆上缓存的GC会花费太长的时间?
多长时间才算太长?
说真的,如果你正在运行一个“吞吐量”垃圾收集器,而这给了你太长的停顿,那么你应该尝试切换到低停顿的收集器,例如CMS或G1。
发布于 2012-01-20 15:52:19
大型缓存的主要问题是整个GC时间。为了给你一个概念,如果你有一个20 GB的缓存,而你的应用程序偶尔会暂停20秒,那么它可能是每GB 1秒(根据应用程序的不同而不同),这是可以接受的吗?
作为直接和内存映射文件的粉丝,我倾向于考虑何时不将数据放在堆之外,而只是为了简单起见使用堆。;)内存映射文件对整个GC时间几乎没有影响,无论大小如何。
使用内存映射文件的优点之一是它可以比您的物理内存大得多,但仍然可以执行得相当好。这使得操作系统可以决定哪些部分应该在内存中,哪些部分需要刷新到磁盘。
顺便说一句:拥有更快的固态硬盘也很有帮助;)更大的硬盘也往往更快。检查他们可以执行的IOPs。
在本例中,我创建了一个映射到16 GB机器上的8TB文件内存。http://vanillajava.blogspot.com/2011/12/using-memory-mapped-file-for-huge.html
请注意,它在80 GB文件示例中的性能更好,8 TB可能是过度杀伤力。;)
https://stackoverflow.com/questions/8936627
复制相似问题