Classloader类的缓存机制
来源:互联网 发布:安卓手机版mac修改大师 编辑:程序博客网 时间:2024/05/22 08:26
当我们用ClassLoader去加载类的时候,我们会看到它的loadclass方法,如下:
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { synchronized (getClassLoadingLock(name)) { // First, check if the class has already been loaded Class<?> c = findLoadedClass(name); if (c == null) { long t0 = System.nanoTime(); try { if (parent != null) { c = parent.loadClass(name, false); } else { c = findBootstrapClassOrNull(name); } } catch (ClassNotFoundException e) { // ClassNotFoundException thrown if class not found // from the non-null parent class loader } if (c == null) { // If still not found, then invoke findClass in order // to find the class. long t1 = System.nanoTime(); c = findClass(name); // this is the defining class loader; record the stats sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0); sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1); sun.misc.PerfCounter.getFindClasses().increment(); } } if (resolve) { resolveClass(c); } return c; } }它有一个方法如下:
Class<?> c = findLoadedClass(name);protected final Class<?> findLoadedClass(String name) { if (!checkName(name)) return null; return findLoadedClass0(name); } private native final Class<?> findLoadedClass0(String name);我们发现这是一个native方法,它在jvm底层,做了缓存,缓存的方法在哪里呢,如下:
private Class<?> findBootstrapClassOrNull(String name) { if (!checkName(name)) return null; return findBootstrapClass(name); } // return null if not found private native Class<?> findBootstrapClass(String name);
这个findBootstrapClass方法是个native的方法,它是去获取BootStrapClassLoader里面加载的类是否有这个类,有的话,说明这个类已经被bootStrapClass加载了,
没有的话,用自己的findclass方法加载,findclass是要被子类实现的,以UrlClassLoader子类的findclass方法为例,里面会有defineClass(name, res);方法,
defineClass方法里面会调用如下方法:
private native Class<?> defineClass2(String name, java.nio.ByteBuffer b, int off, int len, ProtectionDomain pd, String source);
这个是个native方法,用来加载类,加载的类会缓存到jvm中,通过上面的findLoadedClass方法我们就可以获取到这个类是否被加载过。同时我们在tomcat中加载类的时候,
用到了一个WebappClassLoader,它重写了ClassLoader的loadClass方法,它也做了缓存处理,如如下:
@Override public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { synchronized (getClassLoadingLock(name)) { if (log.isDebugEnabled()) log.debug("loadClass(" + name + ", " + resolve + ")"); Class<?> clazz = null; // Log access to stopped class loader checkStateForClassLoading(name); // (0) Check our previously loaded local class cache protected Class<?> findLoadedClass0(String name) { String path = binaryNameToPath(name, true); ResourceEntry entry = resourceEntries.get(path); if (entry != null) { return entry.loadedClass; } return null; }
它把缓存的类放到了一个resourceEntries变量中,这个变量是个map,可以是class类的全限定名,value是一个存放class的类。这个class类是在WebappClassLoaderBase的
findclass方法中的findclassInternal中put进去的。
Spring中也定义了类加载器:ContextClassLoader,其中的原理与此类似。
阅读全文0 0
- Classloader类的缓存机制
- java 的类加载机制(classloader)
- 类装载器ClassLoader的工作机制
- java 类的加载(ClassLoader)机制
- Java类的加载机制 ClassLoader
- 类加载器CLASSLOADER的工作机制
- java 的 ClassLoader 类加载机制详解
- Java的ClassLoader机制
- Java的Classloader机制。
- tomcat的classloader机制
- Java 的 ClassLoader 机制
- tomcat的classloader机制
- JVM的Classloader机制
- classLoader类加载机制
- ClassLoader类加载机制
- classLoader类加载机制
- 类加载机制ClassLoader
- 类加载机制ClassLoader
- 非接触CPU卡外部认证步骤
- out对象
- MVC与单元测试实践之健身网站(四)-动作管理
- Thinstation 方案
- Cake
- Classloader类的缓存机制
- React 组件之间如何交流
- PASCAL VOC 数据集
- netty 学习(1)
- Python快速入门(3)-逻辑控制与循环
- iOS ASI 笔记
- 爬虫的基本流程 网络爬虫的基本工作流程如下: 首先选取一部分精心挑选的种子URL 将种子URL加入任务队列 从待抓取URL队列中取出待抓取的URL,解析DNS,并且得到主机的ip,并将URL对应的网
- Android调试之tombstone信息的分析
- 【python学习笔记】6.list和tuple的操作
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
宝宝八个月食谱
微宝宝
周岁宝宝
宝宝睡觉
宝宝外套
3岁宝宝
女宝宝护理
我要宝宝
宝宝裙子
宝宝内裤
1岁宝宝
宝宝长牙
宝宝孕树
宝宝围嘴
婴儿宝宝
四个月宝宝食谱
迪士尼宝宝
房宝宝
小宝宝食谱
宝宝照哪里好
宝宝服饰
宝宝咳嗽食谱
本宝宝
宝宝英文
宝宝的
车宝宝
宝宝牙膏
1岁宝宝早教
宝宝内衣
宝宝睡眠少
宝宝饮用水
宝宝抽动症怎么办
店宝宝好用吗
宝宝腹泻食谱
好奇宝宝
王宝宝
宝宝怎么教育
绵宝宝
宝宝一岁
宝宝婴儿床
故事宝宝