摘要: 小光是一名私家侦探,是小光侦探事务所的认真人。此日,他正在事务所中品茗,溘然接到警官M的电话,说接到线上总共三台呆板,有一台呆板报警,Java堆内存占用高出95%,无法正常得随处事器的响应。小光布置警官M保存好现场,急仓皇的赶往了现场…
案发
小光是一名私家侦探,是小光侦探事务所的认真人。此日,他正在事务所中品茗,溘然接到警官M的电话,说接到线上总共三台呆板,有一台呆板报警,Java堆内存占用高出95%,无法正常得随处事器的响应。小光布置警官M保存好现场,急仓皇的赶往了现场…
路上
在前往现场的路上,小光思考了以下几个问题:
揣摩大概是:
要害是分派大量内存,且无法被有效GC。
现场
达到现场后,小光当即着手从现场找到有用的线索,别离在案发明场(问题JVM)做了以下几件事
以失败了却,JVisualVM长时间无法毗连。(为什么无法毗连乐成,昆山软件开发,参考思考1)
大概是当前用户无权限导致的。可是jmx应该不是,思考失败原因,参考归档1
亏得警官M在之前已经jmap出来一部门有效信息了,参考如下图:
可是,按照这个线索,只能定位到是String导致堆内存占满的,并没有其他有效的信息,而String工具是整个措施运行期间随处都有利用的,很难去直接定位到问题地址…
至此,现场勘查根基完成,可是并没有什么收获有效的可一次定位问题的信息。只能清理现场、重启处事,以防备影响后续处事。
现场监控信息
现场已经被清理了,可是现场尚有一些监控信息。同时询问大抵案发时间,是八点三十分阁下,对部门内容取8-9点之间的信息,包罗有以下内容:
请求M警官协助,拉取了问题机当天的所有日志,一起别的一台没有问题的呆板的所有日志,利便做差别阐明。
在堆内存险些占满时,GC时间也变的很长,GC日志有必然的参考代价。
查察应用日志目次,发明有dkimi目次,看了下内里大抵内容,发明是dkimi这个agent层的一些日志,也包罗了一些有用信息,可是文件较大没有拉出来,有需要的时候本身去处事器上查察。
monitor-matrix.zeus
线索阐明
线索有以下内容:
直接从1、3、4、5中并不能直接阐明出问题地址,可是可以按照这些信息得出一个很是有代价的线索:案发时间
1. 确定案发时间
由图4可知,劳务派遣管理系统,案发时间在8:24分阁下,但不确定该监控平台的监控隔断,以实时间的精确性。通过查抄dkimi日志,发明每隔30s会自动上报当前jvm状态json数据,状态中包罗了jvm:gc:ParNew:time,即gc时间。
cat dkimi-agent.2018-01-10.log | grep '2018-01-10 08:2[2-5]:.*HeartB.*jvm:gc:ParNew:time' 2018-01-10 08:22:26 - jvm:gc:ParNew:time:2107 2018-01-10 08:22:56 - jvm:gc:ParNew:time:2107 2018-01-10 08:23:26 - jvm:gc:ParNew:time:2128 2018-01-10 08:23:56 - jvm:gc:ParNew:time:9462 2018-01-10 08:24:28 - jvm:gc:ParNew:time:19735 2018-01-10 08:24:59 - jvm:gc:ParNew:time:21332 2018-01-10 08:25:44 - jvm:gc:ParNew:time:22556