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;
}
loosejar原理简要分析的更多相关文章
- libco协程原理简要分析
此文简要分析一下libco协程的关键原理. 在分析前,先简单过一些协程的概念,以免有新手误读了此篇文章. 协程是用户态执行单元,它的创建,执行,上下文切换,挂起,销毁都是在用户态中完成,对linux系 ...
- C打印函数printf的一种实现原理简要分析
[0]README 0.1)本文旨在对 printf 的 某一种 实现 原理进行分析,做了解之用: 0.2) vsprintf 和 printf.c 的源码,参见 https://github.com ...
- Java7中的ForkJoin并发框架初探(中)——JDK中实现简要分析
原文发表于 2013 年 8 月 28 日 由 三石 根据前文描述的Doug Lea的理论基础,在JDK1.7中已经给出了Fork Join的实现.在Java SE 7的API中,多了ForkJoin ...
- [转]Java7中的ForkJoin并发框架初探(中)——JDK中实现简要分析
详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp85 根据前文描述的Doug Lea的理论基础,在JDK1.7中已经给 ...
- Android初级教程通过简要分析“土司”源码,来自实现定义土司理论探讨
由于系统自带的土司瞬间即逝,而且非常难看.因此我们就希望自定义自己的土司风格.有些实例就是基于自定义土司完成的,例如金山卫士的火箭发射,基本原理就是个土司.但是在做出自己的土司风格之前,还是要简要分析 ...
- [Java] HashMap 源码简要分析
特性 * 允许null作为key/value. * 不保证按照插入的顺序输出.使用hash构造的映射一般来讲是无序的. * 非线程安全. * 内部原理与Hashtable类似. 源码简要分析 pu ...
- 20169212《Linux内核原理与分析》课程总结
20169212<Linux内核原理与分析>课程总结 每周作业链接汇总 第一周作业:完成linux基础入门实验,了解一些基础的命令操作. 第二周作业:学习MOOC课程--计算机是如何工作的 ...
- Activity源码简要分析总结
Activity源码简要分析总结 摘自参考书籍,只列一下结论: 1. Activity的顶层View是DecorView,而我们在onCreate()方法中通过setContentView()设置的V ...
- 20169212《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...
随机推荐
- ACM算法目录
数据结构 栈,队列,链表 •哈希表,哈希数组 •堆,优先队列 双端队列 可并堆 左偏堆 •二叉查找树 Treap 伸展树 •并查集 集合计数问题 二分图的识别 •平衡二叉树 •二叉排序树 •线段树 一 ...
- SCOI2014题解
SCOI2014由极不靠谱的电子坑爹大学出题.电子坑爹大学打破了多年行规,暴力+NOIP500分居然不能进队.极其逗比的第一天暴力给10分!!还好有些题不是很难,省队爷分数大概在150以上(最高420 ...
- ACM_Alien And Password
Alien And Password Time Limit: 2000/1000ms (Java/Others) Problem Description: Alien Fred wants to de ...
- Hadoop Hive概念学习系列之hive里的优化和高级功能(十四)
在一些特定的业务场景下,使用hive默认的配置对数据进行分析,虽然默认的配置能够实现业务需求,但是分析效率可能会很低. Hive有针对性地对不同的查询进行了优化.在Hive里可以通过修改配置的方式进行 ...
- linux设置库文件加载包含路径
第一种方式vim /etc/ld.so.conf 将要包含的路径添加到此文件中退出重新登录使配置生效或者执行命令source /etc/ld.so.conf 另一种方式利用LIBRARY_PATH和L ...
- 【反射】Java反射机制
Class 1.Class是一个类,一个描述类的类(也就是描述类本身),封装了描述方法的Method,描述字段的Filed,描述构造器的Constructor等属性 2.对象照镜子后(反射)可以 ...
- linux php全能环境一键安装,小白福利!
phpStudy Linux版&Win版同步上线 支持Apache/Nginx/Tengine/Lighttpd/IIS7/8/6 phpStudy for Linux 支持Apache/Ng ...
- cmd 切换目录和配置环境变量
记录一下: 在用cmd进行切换盘符的时候, 如果是从 C盘切换到其他盘的话: D:直接回车就行了. 如果是在同一个盘符内切换文件夹的话,cd D:\ComputerSoft\curl\curl-7.6 ...
- Power Designer逆向操作(从mysql5.0生成数据库的物理模型)
Power Designer逆向操作(从mysql5.0生成数据库的物理模型) 环境:powderdesigner12.5:mysql5.0 步骤: 1. 为指定的数据库配置MySQL的ODBC数据 ...
- 《C++ Primer 第5版》第1章
1.1 一个简单的C++程序 #include <iostream>int main() { std::cout << "Hello World!" ...