JAVA虚拟机之类加载器
转载请声明:原文转自http://www.cnblogs.com/xiezie/p/5909570.html
1.JVM的生命周期
1.1 JVM的生命周期和程序的生命周期一致
1.2 JVM结束生命周期的情况
1.执行System.exit(int n);//0为正常关闭,!0为异常关闭
2.系统抛出未捕获的异常,或者抛出错误
3.操作系统错误,导致JAVA进程关闭
4.正常执行结束
2. JAVA程序对类的使用方式
1.主动使用:
- -创建类的实例对象
- -类被静态调用
- -类的静态成员变量被调用或者赋值
- -类的静态方法被调用
- -其子类被主动使用
- -通过反射调用
- -Java虚拟机启动时被标明为启动类的类(包含main方法)
2.被动使用:
除了被主动使用之外的方式都属于被动使用(通过classloader.loadclass也算被动使用)
3.类加载器的加载、连接及初始化
3.1 加载:查找并加载类的二进制文件
1.类加载器的共性
- 除了根加载器,每个类加载器都有一个父类加载器(但是父子间并非一定是继承关系,实现方式是包装、修饰方式)
ClassLoader parent;
protected ClassLoader() {
this(checkCreateClassLoader()//安全监测
, getSystemClassLoader());//默认设置父类加载器是系统加载器
}
protected ClassLoader(ClassLoader parent) {
this(checkCreateClassLoader(), parent);
}
- 每个加载器都有命名空间(命名空间由该加载器和其父类加载器加载的类构成)
- 类的加载机制是父亲委托机制(基于安全性的考虑),即加载类的时候先找父类加载器,没有的时候再找子类加载
实际加载类的类加载器为定义类加载器,其包括其一下的类加载器为初始类加载器
- .class的获取:
- 通过直接加载.class文件(如Elipse编译生成的class文件)
- 从网络获取.class文件————(如URLClassLoader)
- 从ZIP、jar文件中加载.class文件
- 动态编译生成
- 从专用数据库中获取
- 类加载的时机:
- JVM规范允许类加载器在预料某个类将要被使用时就预先加载它
- 类加载器并不需要等到某个类被“首次主动使用”时再加载它
- 类加载的最终产品是位于堆中的class对象(封装类的方法区内的数据结构)、而且在方法区中放入类的数据结构的接口
2.分类:
- 根加载器(Bootstrap):
- 如果从JAVA代码中获取JAVA核心类库的加载器会返回null——这个加载器无法从java层获取
- 由JAVA底层的C++实现、执行调用,主要负责加载JVM的核心类库,如执行Java.lang.*包下的一些类
- 没有父类加载器,也不继承ClassLoader
- 扩展加载器(Extension):ExtClassLoader
- 主要负责加载java.ext.dirs目录下的类库,或者是JRE目录下的lib\ext目录下的类库,放在这个目录下的jar文件也由扩展加载器自动加载
- ClassLoader的子类
- 系统加载器(System):也称为应用加载器,AppClassLoader
- 主要负责环境变量中的ClassPath目录下的类加载
3.类加载错误
- 如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误(LinkageError错误)
- 如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误
3.2 连接:将加载到内存的二进制数据合并到JAVA运行时环境
1.验证:确保被加载类的正确性
- -类文件的结构检查
- -语义检验,是否符合JAVA语言规范
- -字节码验证
- -二进制兼容性的验证,如jdk1.5生成的.class文件和jdk1.6生成的.class文件可能存在兼容性问题
2.准备:为类的静态变量分配内存,并初始化其值为默认值。
3.解析:将类中的符号引用转换直接引用
- 符号引用
- 直接引用
3.3初始化:为类的静态变量赋予正确的初始值
4.类的卸载
(还在学习中...)
JAVA虚拟机之类加载器的更多相关文章
- Hotspot Java虚拟机的类加载器
从Java虚拟机角度来讲,有两种类加载器.1.启动类加载器.(Bootstrap ClassLoader,C++)2.所有其他类加载器.(Java,java.lang.ClassLoader) 系统提 ...
- java虚拟机的类加载器
一.类的加载可以简单分成两种方式,静态加载和动态加载. 1.静态加载,就是new等方式使用到一个类的实例时,程序在运行到该处时,会把该类的.class文件加载到jvm里. 2.动态加载,通过Class ...
- 【深入理解Java虚拟机 】类加载器的命名空间以及类的卸载
类加载器的命名空间 每个类加载器又有一个命名空间,由其以及其父加载器组成 类加载器的命名空间的作用和影响 每个类加载器又有一个命名空间,由其以及其父加载器组成 在每个类加载器自己的命名空间中不能出现相 ...
- 深入理解JVM(③)虚拟机的类加载器(双亲委派模型)
前言 先解释一下什么是类加载器,通过一个类的全限定名来获取描述该类的二进制字节流,在虚拟机中实现这个动作的代码被称为"类加载器(Class Loader)". 类与类加载器 类加载 ...
- 黑马程序员——【Java高新技术】——类加载器
---------- android培训.java培训.期待与您交流! ---------- 一.概述 (一)类加载器(class loader) 用来动态加载Java类的工具,它本身也是Java类. ...
- 深入理解java虚拟机【类加载机制】
Java虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程. 在加载阶段,java虚拟机需要完成以下 ...
- Java中的类加载器
转载:http://blog.csdn.net/zhangjg_blog/article/details/16102131 从java的动态性到类加载机制 我们知道,Java是一种动态语言.那么怎 ...
- Java中的类加载器以及Tomcat的类加载机制
在加载阶段,虚拟机需要完成以下三件事情: 1.通过一个类的全限定名来获取其定义的二进制字节流. 2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构. 3.在Java堆中生成一个代表这个类 ...
- 黑马程序员:Java基础总结----类加载器
黑马程序员:Java基础总结 类加载器 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个 ...
随机推荐
- [HDOJ3367]Pseudoforest(并查集,贪心)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3367 求一个无向图上权值最大的伪森林. 伪森林:一个图的连通子图,当且仅当这个子图有且仅有一个环. 既 ...
- [原]用WebBrowser组件模拟人工运行搜索引擎自动点击搜索结果的实验
本代码只是业余时间无聊写着试试,用WebBrowser组件模拟人工运行搜索引擎自动点击搜索结果的实验 这是网络中盛传的提高搜索引擎点击率的一种方式,当然属于作弊,不推荐各位使用.另外这种方式的性能不佳 ...
- gulp.watch监听文件
Gulp.watch()会返回我们熟知的watcher.我们可以利用watcher来监听额外的事件或者向watch中添加文件. 例如,在执行一系列任务和调用一个函数时,你就可以在返回的watcher中 ...
- Ogre内存池的使用和说明
大家可能会遇到一些Ogre中的内存分配的方面问题,我对这个总结了一下内存分配的方面资料. Ogre在1.7版本后,统一了内存分配策略,提供了内存是否泄漏的跟踪和内存池等比较方便开发的一些策略,目前提供 ...
- 最大流算法(Edmons-Karp + Dinic 比较) + Ford-Fulkson 简要证明
Ford-Fulkson用EK实现:483ms #include <cstdio> #include <cstring> #define min(x,y) (x>y?y: ...
- super.getClass()方法
下面程序的输出结果是多少? importjava.util.Date; public class Test extends Date{ public static void main(String[] ...
- bzoj3242
如果是树,那么一定选择树的直径的中点 套了个环?裸的想法显然是断开环,然后求所有树的直径的最小值 环套树dp的一般思路,先把环放到根,把环上点下面的子树dp出来,然后再处理环上的情况 设f[i]表示以 ...
- LA 2572 (求可见圆盘的数量) Kanazawa
题意: 把n个圆盘依次放到桌面上,按照放置的先后顺序给出这n个圆盘的圆心和半径,输出有多少个圆盘可见(即未被全部覆盖). 分析: 题中说对输入数据进行微小扰动后答案不变. 所露出的部分都是由若干小圆弧 ...
- (转)c语言_链表实例讲解(两个经典例子)
建立一个学生成绩的线性链表,对其实现插入,删除,输出,最后销毁. #include <stdio.h>#include <stdlib.h> struct grade { ...
- HDU 3749 Financial Crisis 经济危机(点双连通分量)
题意: 给一个图n个点m条边(不一定连通),接下来又q个询问,询问两个点是为“不相连”,“仅有一条路径可达”,“有两条及以上的不同路径可达”三种情况中的哪一种.注:两条以上的路径指的是路径上的点连1个 ...