首页 > 代码库 > loosejar原理简要分析
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; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。