使用MemoryAnalyzer分析dump文件解决内存泄露问题

获取到dump文件,大概四个G左右,使用JDK自带的jvisualvm工具分析(可以跳过jvisualvm直接使用MemoryAnalyzer进行分析)。

运行jvisualvm,选择【文件】-->【装入】

 

找到对应的dump文件

 

装入好后查看到实例数最多的几个类,如下图所示。

前面三个类是常用的工具类,很多地方都有使用,如果从这里入手排查,难度会非常大。

第四第五的可以定位到类java.security.Provider

 

查到类java.security.Provider的子类有十几个,一个个去查询工作量也非常大

 

接下来使用MemoryAnalyzer分析一下该dump文件,因为该dump文件比较大,需要修改MemoryAnalyzer.ini文件的最大堆内存配置

 

打开MemoryAnalyzer,选择【File】-->【Open Heap Dump…】

找到dump文件,选择打开

 

 

使用Leak Suspects Report进行分析,报告将显示系统可能存在的内存泄露情况

 

 

Leak Suspects Report定位到类javax.crypto.JceSecurity,点击下方的Details

 

 

 

进一步定位到类org.bouncycastle.jce.provider.BouncyCastleProvider

 

 

 

根据类org.bouncycastle.jce.provider.BouncyCastleProvider定位到问题代码

 

        Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5PADDING", new BouncyCastleProvider());

 

优化后代码如下

 

      private static BouncyCastleProvider decryptBouncyCastleProvider = null;

     

      private static BouncyCastleProvider getDecryptProviderInstance() {

            if (decryptBouncyCastleProvider == null) {

                  synchronized (DesUtils.class) {

                        if (decryptBouncyCastleProvider == null) {

                              decryptBouncyCastleProvider = new BouncyCastleProvider();

                        }

                  }

            }

            return decryptBouncyCastleProvider;

      }

 

      Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5PADDING", getDecryptProviderInstance());

 

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值