// java.lang.management.ManagementFactory
private val mxBeans = ManagementFactory.getGarbageCollectorMXBeans
private val minorBean = mxBeans.get(0)
private val majorBean = mxBeans.get(1)
val majorGcCount = majorBean.getCollectionCount
val majorGcTime = majorBean.getCollectionTime
val minorGcCount = minorBean.getCollectionCount
val minorGcTime = minorBean.getCollectionTime
es的gc监控带来的启发
最近看到es中一段gc log
感觉es对gc的监控做的还是不错的,我就很好奇是怎么实现的,因为前段时间做gc监控的时候,我记得从MXBeans并没有这么详细的信息,我们当时的做法是
所以就决定跟踪下es的实现细节,其中主要实现在
org.elasticsearch.monitor.jvm.JvmMonitorService.JvmMonitor
的monitorLongGc
这个方法中初始化的这个service的时候会设置
interval
,默认为1s一次,也就是一秒一次的调用MXBeans中的gcMonitor的方法,并且在这个类中保存lastJvmStats
,每次检测是判断本次的gcCount和上一个状态的gcCount是否相等,如果不等,则意味着发生了gc,则获得gc时长,然后按照设置的阈值,选择是否打印日志这个实现思路可以用在我们以后对gc作为事件的采集思路,因为gc这种如果作为周期性report的话,其实效果一般,理想状态下是其他指标作为线段,而gc事件作为线段的纵切线 类似下图,将gc做成虚线的纵切线,这样参照比较有价值,假设线段显示的指标是响应时间,那么在响应时间明显增加的时候我们可以看那个时间点是否发生gc之类的
相关代码:
完整代码:
目前我看的版本是
es-2.3
es github
另外在最新版中,这部分代码被放到了
JvmGcMonitorService