吃透Elasticsearch堆内存

2022-01-10 00:00:00 缓存 对象 内存 指针 大小

吃透Elasticsearch堆内存


1.什么是堆内存?

Java 中的堆是 JVM 所管理的大的一块内存空间,它是Java内存管理的核心区域,用来存放Java对象实例,几乎所有创建的Java对象实例都是被直接分配在堆上。堆被所有的线程共享,在虚拟机启动时,我们指定的“Xmx”之类参数就是用来指定大堆空间等指标。
理所当然,堆也是垃圾收集器重点照顾的区域,所以堆内空间还会被不同的垃圾收集器进行进一步的细分,
在 Java 中,堆被划分成两个不同的区域:

  • 新生代 ( Young )

  • 老年代 ( Old )

新生代 ( Young ) 又被划分为三个区域

  • Eden

  • From Survivor

  • To Survivor

这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。

2.堆内存的作用是什么?

在虚拟机启动时创建。

堆内存的目的就是创建对象实例,所有的对象实例和数组都要在堆上分配。

堆是由垃圾回收来负责的,因此也叫做“GC堆”,垃圾回收采用分代算法,堆由此分为新生代和老年代。

堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。

但缺点是,由于要在运行时动态分配内存,存取速度较慢。当堆内存因为满了无法扩展时就会抛出java.lang.OutOfMemoryError:Java heap space异常。出现这种情况的解决办法具体参见java调优。

3.堆内存如何配置?

默认情况下,Elasticsearch JVM使用堆内存小和大大小为2 GB(5.X版本以上)。

早期版本默认1GB,官网指出:这明显不够。

在转移到生产环境时,配置足够容量的堆大小以确保Elasticsearch功能和性能是必要的。

Elasticsearch将通过Xms(小堆大小)和Xmx(大堆大小)设置来分配jvm.options中指定的整个堆。

举例如下:
设置方式一:
在jvm.options配置文件中设置堆内存。

-Xms2g 
-Xmx2g

相关文章