zoukankan      html  css  js  c++  java
  • loosejar原理简要分析

     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; }



  • 相关阅读:
    P4999 烦人的数学作业
    P3413 SAC#1
    P2657 [SCOI2009]windy数
    P2602 [ZJOI2010]数字计数
    JSOI2007 建筑抢修
    CF161B Discounts
    Description
    Street Numbers
    Pizza Cutting
    Supermean
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/6877806.html
Copyright © 2011-2022 走看看