深入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)
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)
相关文章推荐
- Statement和PreparedStatement深入学习总结
- ZooKeeper学习总结 第二篇:ZooKeeper深入探讨
- 深入理解JVM 学习笔记2
- Java学习总结记录(2)——JVM、JRE和JDK
- tomcat配置(JVM基础:深入学习JVM堆与JVM栈)
- JVM学习总结一——内存模型
- 【深入理解JVM】学习笔记——-1、JVM基本结构
- Java集合深入学习总结-LinkedHashMap
- JVM学习总结五(番外)——JConsole
- jvm关于内存管理和垃圾回收的学习总结
- 深入理解JVM虚拟机学习笔记(四)虚拟机性能监控和故障处理工具
- 【前端学习笔记】深入学习Javascript:EVENT总结
- 深入学习JVM内存设置原理和调优
- Maven深入学习(四)- 知识总结
- 【总结】深入JVM之源码编译机制
- Maven学习总结(13)——深入理解maven灵活的构建
- JavaScript学习总结【4】JS深入