问题描述
某个项目上,java程序总是莫名其妙无法挂掉,挂掉的时间点并不固定。
分析过程:
服务刚崩溃的时候,查看了服务器性能,CPU飙升,服务重启后,CPU降低至3%左右
对日志进行分析,未找到问题原因,于是对项目进行重启后,打开JDK自带的分析工具VisualVM
对服务进行监控,VisualVM
在jdk安装目录下
监控界面如图
在CPU飙升时,堆Dump
以及线程界面的线程Dump
保存当前的快照。
首先对线程Dump进行分析,并未找到有效信息(看的不太懂,云里雾里的,只能找运行中的线程,看有没有熟悉的代码,然后分析是否可能会出问题)
接下来对堆Dump
进行分析,可以看到,char类型占的内存最多,缓存一下有1.5个G
双击进入,并根据大小进行降序排列
此时可以看到最多的一个占用了883404522字节,换算一下如图,占据了800多兆内存,这肯定是不正常的
目前已经发现了异常点,那么继续,在右边找到char数据,点击鼠标右键,选择显示最近的垃圾回收根节点
此时找到了下边的String,然后继续右键,在线程中显示
此时就跳转到了线程信息中,定位到了熟悉的代码中,经过分析,发现这块代码是转发前端传过来的接口的,根据char中的数据内容来看,确定是第三方接口返回的数据。
到此问题就已经排到结束了,具体原因为:代码中调用的第三方接口,第三方接口数据未经过过滤。且数据量很大,全部返回过来把服务搞崩了,接口调用加上限制就解决了