客户使用的项目突然不能用了,查看日志显示OutOfMemoryError:Java heap space
然后后面跟着一堆,看着自己写的代码部分,没找出问题所在
只能老老实实跟着步骤来:
1.先看下普通的
jmap -histo:live pid >log.log
看下能不能直接找到问题所在,好吧没有有效信息,继续
2.生成内存快照 dump
jmap -dump:live,format=b,file=dump.hprof 你的pid
3.安装JProfiler分析dump
附上下载链接:链接:https://pan.baidu.com/s/1lh2TL9F1kPcG1sKgJApbMQ 提取码:t15c
(1)解压先安装exe(2)打开KeyGen 运行
安装的时候用户名对应填写userId 就行,公司随便写
安装好后直接双击之前生成的dump.hprof
等待时间比较长,不要点任何取消或者跳过,加载完后会出现下面界面
到这里你就可以查看指定的类,对象等
查看的方法都是对着要查看的项右键
就会出现你选中的使用的地方,当然也可以直接选中大对象
像我这里一目了然就发现第一个的使用内存异常,如果是自己写的可以点进去查看具体信息
因为这个包是javax的,百度查看这个发现结果是在使用
BouncyCastleProvider对象时,频繁调用,未被回收造成的问题
查看源码:
每一次new BouncyCastleProvider() 在源码缓存这个对象使用的是IdentityHashMap 虽然每次的hashcode得出的值都是相同的,但是由于IdentityHashMap在判断key相同时使用的是==,于是乎每次new创建的对象都是不同的,不断的往map里面堆放
解决方法使用静态字段方式复用对象