loosejar原理简要分析

25 篇文章 0 订阅
 loosejar这个小工具可以动态分析出应用中有每个jar包的实际使用情况,详情请参阅 《通过loosejar清理应用中冗余的jar包》基本原理是利用instrumentation的特性用 Instrumentation,开发者可以构建一个独立于应用程序的代理程序(Agent),用来监测和协助运行在 JVM 上的程序,甚至能够替换和修改某些类的定义。有了这样的功能,开发者就可以实现更为灵活的运行时虚拟机监控和 Java 类操作了。关于instrumentation的详细介绍,可以参阅这篇文章 《Java SE 6 新特性: Instrumentation 新功能》

private Map<ClassLoader, List<String>> createClassLoaderMap()
  {
    //创建一个map,key是classloader,value是由这个classloader所加载的类的名称组成的一个list
    Map<ClassLoader, List<String>> map = new HashMap();
    //instrumentation这个方法可以的得到由所有被classloader加载的类组成的一个数组
    Class<?>[] loadedClasses = this.instrumentation.getAllLoadedClasses();
//格式化打印出上面方法返回数组的长度
    Logger.log(String.format("Found %d classes loaded in the JVM.", new Object[] { Integer.valueOf(loadedClasses.length) }));
    //遍历所有被加载的类
for (Class<?> c : loadedClasses)
    {
      //获取加载当前类的classloader
 ClassLoader cl = c.getClassLoader();
 //如果当前类的加载器不为null,就判断map中是否已经有这个加载器了
      if (cl != null) {
//如果map中已经有了这个classloader,就将当前类的名字添加到与classloader对应的list当中
        if (map.containsKey(cl))
        {
          ((List)map.get(cl)).add(c.getName());
        }
//如果map中没有这个classloader,就创建一个新的list,将当前类的名称放到list中
//然后将classloader和这个list添加到map中
        else
        {
          List<String> classNames = new ArrayList();
          classNames.add(c.getName());
          map.put(cl, classNames);
        }
      }
    }
//格式化打印出map中classloader的数量
    Logger.log(String.format("Found %d various ClassLoader(s) inside the JVM.", new Object[] { Integer.valueOf(map.size()) }));
    //返回map
return map;
  } 


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值