您的位置:首页 > 其它

深入jvm学习总结

2012-06-28 22:08 218 查看
(1)两种类型的类加载器:

1.用户自定义的类加载器

--java.lang.ClassLoader的子类 ,覆盖它的findClsss(String name)方法即可,参数指定类的名称,返回对应的class对象的引用

--用户可以定制类的加载方式

2.jvm自带 提供了3种类加载器:

根(Bootstrap)类加载器(使用c++编写,程序员无法在java代码中获得该类);该类加载器没有父类加载器。负责加载虚拟机的核心类库,如java.lang.*;实现了依赖底层操作系统,属于虚拟机的一部分,没有继承java.lang.ClassLoader类。

扩展(extension)类加载器,使用java代码实现;它的父类加载器为根类加载器;它从java.ext.dirs系统属性所指定的目录中加载类库,或者从jdk的安装目录jre\lib\ext子目录加载类库,如果把用户创建的jar放到这个目录下也会自动由扩展类加载器加载。是java.lang.ClassLoader类的子类.

系统加载器(应用加载器),使用java代码实现; 也被称作:应用类加载器,它的父类加载器为扩展类加载器。从环境变量classpath加载,它是用户自定义类加载器的默认父加载器。

(2)类的准备:在准备阶段,java虚拟机为类的静态变量分配内存,并设置默认的初始值。

(3)类的加载、连接与初始化:





加载:查找并加载类的二进制数据。

连接:

--验证:确保被加载的类的正确性

类的验证内容:类文件的结构检查;语义检查;字节码验证;二进制兼容性的验证;

--准备:为类的静态变量分配内存,并将其初始化为默认值

--解析:把类中的符号引用转换为直接引用

初始化:为类的静态变量赋予正确的初始化值

(4)类的加载

加载.class文件的方式:

--从本地系统中直接加载。

--通过网络下载.class文件。

--从zip、jar等归档文件中加载。

--从专有数据库中提取.classs.

--将java源文件动态编译为.class文件.

类的加载的最终产品是位于堆区中的class对象。

Class对象封装了类在方法去内的数据结构,并且向java程序员提供了访问方法区内的数据结构的接口。

(5)java程序对类的使用方式分两种:

主动使用(6种);

创建类的实例

访问一个类或接口的静态变量,或者对该静态变量赋值

调用类的静态方法

反射:(Class.forName("com.test")

初始化一个类的子类

java虚拟机启动时被标明为启动类的类



除了以上的6中,其他使用java类的方式被看做是类的被动使用,都不会导致类的初始化;

被动使用;

所有的java虚拟机实现必须在每个类或接口被java程序'‘首次主动使用’时才初始化他们;

(6)java虚拟机将结束生命周期的情况:

--执行System.exit()

--程序正常执行结束

--程序在执行过程中遇到了异常或错误而导致异常终止

--由于操作系统出现错误而导致java虚拟机进程终止

(7)类加载顺序





(8)类加载内部的过程





(8)



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: