线上有一个应用,每过一段时间内存就跑满,因为是非主要应用且周期较长,一直是采取的重启策略。近期有时间,就进行了一番分析。
使用MAT对dump文件进行分析
第一步就已经很清晰了
第二步,点击此处
基本上就可以定位是此处的问题,那么为什么会这样?哪里又用到了呐?
第三步,去代码里搜索这个对象
很巧合,就这么两个地方
打开发现是在用户登录的时候进行加解密的,每次都会new BouncyCastleProvider,有问题嘛?没问题,但是后面就有问题。
看下Cipher.getInstance的代码,里面有一句JceSecurity.getVerificationResult(var1)
这个方法就去每次去判断map里面有没有,没有的话put进去,关键就在这里,这个verificationResults是个IdentityHashMap,而且是static的,并不会回收。