使用MAT找出重复引用的jar或类

这篇文章将介绍一种处理应用中的类(或库)的重复引用以及版本冲突问题的解决方案。这在应用集成阶段非常有效。适用于如下案例:

  • NoClassDefFoundError:在classpath中有两个不同版本的同名类;
  • 集成大型产品:检查同一个版本的jar包是否被重复引入,减少内存占用。

准备工作

安装Memory Analyzer Tools,在eclipse上搜mat插件、百度搜索、谷歌搜索都可以。

获取heap dump文件,参考这里:《关于Heap Dump

步骤

使用MAT打开dump文件,执行Open Query browser->Java basics->Duplicated classes,如下图:

dupClass1_thumb

现在我们可以看到所有重复的类及相关的类加载器了:

dupClass2_thumb

需要注意的是:相关的类必须是被加载过才能找得到。

一个小技巧

既然我们已经做到这里了,顺便给您展示一下另外一个小tip。通过Inspector视图,可以看到被加载的类具体是在哪个jar包里。举例说,如果一个重复的类是被URLClassloader加载的,只需按以下的步骤执行:

  1. 选择目标类;
  2. 通过类属性页签进入Inspector视图;
  3. 右键点击“_context”属性;
  4. 最后点击“Go Into”。

dupClassContext_thumb

在弹出的窗口窗口中,可以看到属性“_war”,然后就是被加载的类的位置了:

dupClass_war_thumb

######

本文译自下文:
http://community.bonitasoft.com/blog/effective-way-fight-duplicated-libs-and-version-conflicting-classes-using-memory-analyzer-tool


仅有1条评论 发表评论

  1. 引用通知: MemoryAnalyzer介绍及使用 | 神刀安全网 /

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据