jvm-32GB-内存指针压缩

参考:https://www.elastic.co/guide/cn/elasticsearch/guide/current/heap-sizing.html

不要超过 32 GB!编辑

这里有另一个缘由不分配大内存给 Elasticsearch。事实上 , JVM 在内存小于 32 GB 的时候会采用一个内存对象指针压缩技术。html

在 Java 中,全部的对象都分配在堆上,并经过一个指针进行引用。 普通对象指针(OOP)指向这些对象,一般为 CPU 字长 的大小:32 位或 64 位,取决于你的处理器。指针引用的就是这个 OOP 值的字节位置。git

对于 32 位的系统,意味着堆内存大小最大为 4 GB。对于 64 位的系统, 可使用更大的内存,可是 64 位的指针意味着更大的浪费,由于你的指针自己大了。更糟糕的是, 更大的指针在主内存和各级缓存(例如 LLC,L1 等)之间移动数据的时候,会占用更多的带宽。github

Java 使用一个叫做 内存指针压缩(compressed oops)的技术来解决这个问题。 它的指针再也不表示对象在内存中的精确位置,而是表示 偏移量 。这意味着 32 位的指针能够引用 40 亿个 对象 , 而不是 40 亿个字节。最终, 也就是说堆内存增加到 32 GB 的物理内存,也能够用 32 位的指针表示。缓存

一旦你越过那个神奇的 ~32 GB 的边界,指针就会切回普通对象的指针。 每一个对象的指针都变长了,就会使用更多的 CPU 内存带宽,也就是说你实际上失去了更多的内存。事实上,当内存到达 40–50 GB 的时候,有效内存才至关于使用内存对象指针压缩技术时候的 32 GB 内存。oracle

这段描述的意思就是说:即使你有足够的内存,也尽可能不要 超过 32 GB。由于它浪费了内存,下降了 CPU 的性能,还要让 GC 应对大内存。elasticsearch

相关文章
相关标签/搜索