1. 程式人生 > >loosejar原理簡要分析

loosejar原理簡要分析

dev 數量 map() .html 介紹 article sna get add

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



loosejar原理簡要分析