当前位置: 首页 > 未分类>阅读正文

elasticSearch查看heap size

2022.8.2 朱丰华 2256 次 留下评论 1115字

启动日志其实会告诉你 JVM 是否正在使用内存指针压缩。 你会看到像这样的日志消息:

[2022-07-26T09:07:53,005][INFO ][o.e.e.NodeEnvironment    ] [WIN-20220509AVM] heap size [4gb], compressed ordinary object pointers [true]

这里表示heap size大小4gb。

堆(堆栈 heap)内存小于32GB时,会使用指针压缩技术,例如:

[2015-12-16 13:53:33,417][INFO ][env] [Illyana Rasputin] heap size [989.8mb], compressed ordinary object pointers [true]

最后的 true,这表明内存指针压缩正在被使用。如果没有,日志消息会显示 [false] 。

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

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

这段描述的意思就是说:即便你有足够的内存,也尽量不要 超过 32 GB。因为它浪费了内存,降低了 CPU 的性能,还要让 GC 应对大内存。

指定堆内存:

这里有两种方式修改 Elasticsearch 的堆内存。最简单的一个方法就是指定 ES_HEAP_SIZE 环境变量。服务进程在启动时候会读取这个变量,并相应的设置堆的大小。 比如,你可以用下面的命令设置它:

export ES_HEAP_SIZE=10g

此外,你也可以通过命令行参数的形式,在程序启动的时候把内存大小传递给它,如果你觉得这样更简单的话:

./bin/elasticsearch -Xmx10g -Xms10g 

确保堆内存最小值( Xms )与最大值( Xmx )的大小是相同的,防止程序在运行时改变堆内存大小, 这是一个很耗系统资源的过程。

通常来说,设置 ES_HEAP_SIZE 环境变量,比直接写 -Xmx -Xms 更好一点。

如果你不需要对分词字符串做聚合计算(例如,不需要 fielddata )可以考虑降低堆内存。堆内存越小,Elasticsearch(更快的 GC)和 Lucene(更多的内存用于缓存)的性能越好。

本篇完,还有疑问?留下评论吧

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注