Elasticsearch内存 核心概念基于LuceneJava应用内存使用分析Lucene的内存消耗倒排索引。堆内存Lucene中索引是存储在磁盘中一个索引Index由多个段Segment组成。当启动IndexSearcher时会把倒排索引加载到内存中基于不同的数据类型生成不同的词典比如text生成FST结构的词典数值类型生成Bkd tree。Doc Values操作系统缓存当Doc Values占用的内存小于可用内存时会加载到内存中否则会放到page cache中。Elasticsearch内存基本的元数据堆内存包括node的元数据和Cluster的元数据还有内部的一些其他服务比如线程池线程队列等等。field data cache堆内存用于对分词字段进行排序或聚合。使用过程中会将所有字段的值加载到内存中而且构建缓存的代价很高。在正常使用的过程中不建议使用这个字段进行聚合或者排序错误的使用很容易造成OOM。请注意默认的_id这个字段就是text对他进行排序时会使用fielddata cacheNode Query Cache堆内存每个节点的查询缓存以段为基本单元详情查看我的另外一篇文章Shard Request Cache堆内存Shard级别的缓存。主要用于缓存size0的请求aggs和suggestions还有就是hits.total。Indexing Buffer堆内存用于缓存新索引的数据当空间填满之后会将数据写到磁盘上成为一个新的段。聚合操作堆内存聚合会根据需求构建不同的bucket对单个字段进行聚合可能产生固定数量的bucket但是某些场景下比如深层嵌套聚合或者单个字段不同值过多都有可能导致生成大量的bucket而OOM。具体可参考