背景:生产服务运行OA系统服务,用户使用过程中,突然发现服务不能访问,接到用户反馈后,第一时间登陆服务器,发现东方通进程在、端口在,服务器CPU使用率并不高,为不影响用户正常开展业务工作,先将东方通停止,然后再重启,OA应用服务正常。之后对日志文件进行分析,发现应用系统输出的日志中并没有报错日志,但在/opt/soft/tongweb7.0/logs/目录下生成了一个heapxxxxx.bin(xxxx是日期)文件,因此需要对此heap.bin文件进行分析,具体分析过程如下:
声明:程序时启动时就指定了OOM溢出的时候下载bin格式文件:
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/soft/tongweb7.0/logs/heap_$(date +%Y-%m-%d).bin -jar my.jar
也可以生成其他格式的文件:
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/soft/tongweb7.0/logs/heap_$(date +%Y-%m-%d).hprof -jar my.jar
一、使用java自带工具jhat分析,查centos7.5默认jdk路径,并进入
二、发现此目录下并没有jhat工具,因此上官网下载jdk1.8,因为产生heap.bin文件使用的jdk为1.8。
三、解压
四、进入jdk1.8目录,找jhat工具
五、使用jhat工具对heap.bin文件进行分析,但报错
六、查看jhat工具帮助,猜想应该是给jhat工具指定的内存太小
七、于是增加内存配置,但由于虚拟机的内存最大只能支持到6G,给jhat工具配置5G内存,执行命令。
八、但事与愿违,上述命令执行了30分钟,没有结果,因此,另寻他路。经过搜索查询,网上推荐使用MemoryAnalyzer工具,于是官网下载,下载地址为:https://www.eclipse.org/downloads/download.php?file=/mat/1.11.0/rcp/MemoryAnalyzer-1.11.0.20201202-win32.win32.x86_64.zip
九、下载后,对文件进行验证
十、SHA512编码一致,大胆解压使用,使用之前对内存做配置,回事工具运行效率。
十一、双击运行,选择要分析heap文件,运行差不多5分钟,出结果(这取决于电脑的配置,尤其是硬盘的读写速度,因为我的电脑是固态硬盘,所以分析的速度快)。
十二、根据工具分析结果,向研发人员说明问题猜测,由研发人员对程序进行分析判断,解决问题。
综合工具分析结果,猜想是PortletBD程序文件有问题,最终,程序员对此文件进行了逻辑分析判断,对此文件进行了更新,问题得以解决。