新生代和老年代分配的内存比例给多大?
Jvm内存分为新生代和老年代。
新生代(或者伊甸园)
新实例化的对象分配的空间。新生代空间通常都非常小,一般在 100 MB–500 MB。新生代也包含两个 幸存 空间。
老年代
较老的对象存储的空间。这些对象预计将长期留存并持续上很长一段时间。老生代通常比新生代大很多。
新生代、老生代的垃圾回收都有一个阶段会“stop the world”。在这段时间里,JVM 停止了程序运行,以便对对象进行可达性分析,收集死亡对象。在这个时间停止阶段,一切都不会发生。请求不被服务,ping 不被回应,分片不被分配。整个世界都真的停止了。
对于新生代,这不是什么大问题;那么小的空间意味着 GC 会很快执行完。但是老生代大很多,而这里面一个慢 GC 可能就意味着 1 秒乃至 15 秒的暂停——对于服务器软件来说这是不可接受的。
那一般我们给新生代和老年代分配多大的内存呢?他们的比例是多少呢?
一般来说,老年代和新生代的内存比例为2:1是比较合适的。比如给堆内存分配3G,则新生代分配1G,其余都给老年代。在ElasticSearce的配置文件jvm.options文件配置:
-Xms3g //配置堆初始化大小
-Xmx3g //配置堆的最大内存
-Xmn1g //配置新生代内存。
该分配多大的内存给Elasticesearch?
在使用Elasticesearch的时候,我们对装Elasticesearch的机器进行了升级,从最小的8G内存升级到了16G内存,然后到目前的32G内存。一台机器装一个Elasticesearch节点,我们应该怎么分配机器的内存呢?
官方给出了解决方案,把一半(少于)的内存分配给Luence,另外的内存分配给ElasticSearch.
内存对于 Elasticsearch 来说绝对是重要的,它可以被许多内存数据结构使用来提供更快的操作。但是说到这里, 还有另外一个内存消耗大户 非堆内存 (off-heap):Lucene。
Lucene 被设计为可以利用操作系统底层机制来缓存内存数据结构。Lucene 的段是分别存储到单个文件中的。因为段是不可变的,这些文件也都不会变化,这是对缓存友好的,同时操作系统也会把这些段文件缓存起来,以便更快的访问。
Lucene 的性能取决于和操作系统的相互作用。如果你把所有的内存都分配给 Elasticsearch 的堆内存,那将不会有剩余的内存交给 Lucene。这将严重地影响全文检索的性能。
标准的建议是把 50% 的可用内存作为 Elasticsearch 的堆内存,保留剩下的 50%。当然它也不会被浪费,Lucene 会很乐意利用起余下的内存。
我们实际的解决办法是将机器的一半分给Elasticesearch的堆,栈内存、方法区、常量池、非堆内存占用另外一半。