如果你关注过 Elasticsearch 的日志,可能会看到如下类似的内容:
[2018-06-30T17:57:23,848][WARN ][o.e.m.j.JvmGcMonitorService] [qoo--eS] [gc][228384] overhead, spent [2.2s] collecting in the last [2.3s]
[2018-06-30T17:57:29,020][INFO ][o.e.m.j.JvmGcMonitorService] [qoo--eS] [gc][old][228385][160772] duration [5s], collections [1]/[5.1s], total [5s]/[4.4d], memory [945.4mb]->[958.5mb]/[1007.3mb], all_pools {[young] [87.8mb]->[100.9mb]/[133.1mb]}{[survivor] [0b]->[0b]/[16.6mb]}{[old] [857.6mb]->[857.6mb]/[857.6mb]}
看到其中的[gc]关键词你也猜到了这是与 GC 相关的日志,那么你了解每一部分的含义吗?如果不了解,你可以继续往下看了。
我们先从最简单的看起:
1、第一部分是日志发生的时间
2、第二部分是日志级别,这里分别是WARN和INFO
3、第三部分是输出日志的类,我们后面也会讲到这个类
4、第四部分是当前 ES 节点名称
5、第五部分是 GC 关键词,我们就从这个关键词聊起。
友情提示:对 GC 已经了如指掌的同学,可以直接翻到最后看答案。
1、什么是 GC
GC,全称是 Garbage Collection (垃圾收集)或者 Garbage Collector(垃圾收集器)。
在使用 C语言编程的时候,我们要手动的通过 malloc 和 free来申请和释放数据需要的内存,如果忘记释放内存,就会发生内存泄露的情况,即无用的数据占用了宝贵的内存资源。而Java 语言编程不需要显示的申请和释放内存,因为 JVM 可以自动管理内存,这其中最重要的一部分就是 GC,即 JVM 可以自主地去释放无用数据(垃圾)占用的内存。
我们研究 GC 的主要原因是 GC 的过程会有 Stop The World(STW)的情况发生,即此时用户线程会停止工作,如果 STW 的时间过长,则应用的可用性、实时性等就下降的很厉害。
GC主要解决如下3个问题:
1、如何找到垃圾?
2、如何回收垃圾?
3、何时回收垃圾?
我们一个个来看下。
1.1、如何找到垃圾
所谓垃圾,指的是不再被使用(引用)的对象。Java 的对象都是在堆(Heap)上创建的,我们这里默认也只讨论堆。那么现在问题就变为如何判定一个对象是否还有被引用,思路主要有如下两种:
1、引用计数法,即在对象被引用时加1,去除引用时减1,如果引用值为0,即表明该对象可回收了。
2、可达性分析法,即通过遍历已知的存活对象(GC Roots)的引用链来标记出所有存活对象
方法1:简单粗暴效率高,但准确度不行,尤其是面对互相引用的垃圾对象时无能为力。
方法2:是目前常用的方法,这里有一个关键是 GC Roots,它是判定的源头,感兴趣的同学可以自己去研究下,这里就不展开讲了。

1.2、如何回

本文详述了Elasticsearch中的垃圾回收(GC)机制,解析GC日志中的关键信息,包括GC过程、日志读取技巧及Elasticsearch默认GC配置。
最低0.47元/天 解锁文章
2381





