欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 宝鼎售后问题提交 | 后台管理


新闻资讯

MENU

软件开发知识
原文出处: 光闪

摘要: 小光是一名私家侦探,是小光侦探事务所的认真人。此日,他正在事务所中品茗,溘然接到警官M的电话,说接到线上总共三台呆板,有一台呆板报警,Java堆内存占用高出95%,无法正常得随处事器的响应。小光布置警官M保存好现场,急仓皇的赶往了现场…

案发

小光是一名私家侦探,是小光侦探事务所的认真人。此日,他正在事务所中品茗,溘然接到警官M的电话,说接到线上总共三台呆板,有一台呆板报警,Java堆内存占用高出95%,无法正常得随处事器的响应。小光布置警官M保存好现场,急仓皇的赶往了现场…

路上

在前往现场的路上,小光思考了以下几个问题:

  1. 什么环境下会呈现堆内存

    揣摩大概是:

  2. 瞬时并发数增大,且不能快速返回。这种环境需要一些线程的挪用栈中,引用了大量的实例才可以占满堆内存。
  3. 措施中有bug,导致死轮回,在轮回体中一直有分派内存的操纵,且不是姑且变量。
  4. 要害是分派大量内存,且无法被有效GC。

  5. 如何去定位问题
  6. 最直接的方法,堆dump,利用MAT可能JVisualVm来阐明dump文件,找出是那边占用了大量的堆内存。
  7. 当1无法执行时,可以利用jdk自带的一些东西,如jmap来阐明内存。堆有大概是dump不出来的,因为线上堆巨细是8G,且同一台物理机有多个处事在运行,大概会影响其他处事。
  8. 内存作为主要阐明工具,基于上述揣摩1,还需要利用jstack导出线程栈信息。

现场

达到现场后,小光当即着手从现场找到有用的线索,别离在案发明场(问题JVM)做了以下几件事

  1. 实验举办整个案发明场的备份,即堆dump,但被奉告堆内存太大,无法举办dump
  2. 实验利用JMX毗连方针JVM

    以失败了却,JVisualVM长时间无法毗连。(为什么无法毗连乐成,昆山软件开发,参考思考1)

  3. SSH毗连线上处事器,利用JDK自带东西实验获取线索
  4. ps -ef | grep java:找到方针jvm的pid
  5. jmap -histo 方针jvm的pid | head -20:查察Class与对应实例占用环境。可是以失败了却,提示: Attaching to process ID 3991, please wait…
    Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can’t attach to the process
  6. 实验jmap无果,接着实验jstack:jstack 方针jvm的pid:一样以失败了却,提示根基同上
  7. 大概是当前用户无权限导致的。可是jmx应该不是,思考失败原因,参考归档1

    亏得警官M在之前已经jmap出来一部门有效信息了,参考如下图:

    jmap环境

    可是,按照这个线索,只能定位到是String导致堆内存占满的,并没有其他有效的信息,而String工具是整个措施运行期间随处都有利用的,很难去直接定位到问题地址…

至此,现场勘查根基完成,可是并没有什么收获有效的可一次定位问题的信息。只能清理现场、重启处事,以防备影响后续处事。

现场监控信息

现场已经被清理了,可是现场尚有一些监控信息。同时询问大抵案发时间,是八点三十分阁下,对部门内容取8-9点之间的信息,包罗有以下内容:

  1. 应用日志

    请求M警官协助,拉取了问题机当天的所有日志,一起别的一台没有问题的呆板的所有日志,利便做差别阐明。

  2. GC日志

    在堆内存险些占满时,GC时间也变的很长,GC日志有必然的参考代价。

  3. 监控日志

    查察应用日志目次,发明有dkimi目次,看了下内里大抵内容,发明是dkimi这个agent层的一些日志,也包罗了一些有用信息,可是文件较大没有拉出来,有需要的时候本身去处事器上查察。

  4. 监控平台matrix

    monitor-matrix.zeus 监控平台图

线索阐明

线索有以下内容:

  1. 一张jmap图
  2. 应用所有日志
  3. GC日志
  4. dkimi日志
  5. 监控平台图表
  6. 项目源码

直接从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