java 高级
java 虚拟机
1. java虚拟机进程停止的条件:
- System.exit(int status);
- 程序正常执行结束。
- 程序在执行过程中遇到异常或错误而异常终止。
- 由操作系统出现错误而导致java虚拟机进程终止。
2. 类加载过程(加载、连接与初始化)
- 加载:查找并加载class的二进制数据。
- 连接
- 验证:
确保被加载的类的正确性
类文件的结构检查
语义检查
节码验证
二进制兼容性的验证
准备:为类的【静态变量】分配内存,并将其初始化为默认值。
解析:把类的符号引用转换为直接引用。
初始化:为类的静态变量赋予正确的初始值。
3. java程序对类的使用方式可分为两种
主动使用(6种)会导致类被加载
创建类的实例(new)
访问某个类或者接口的静态变量、或者对该静态变量赋值
静态的编译时常量不会初始化,编译时变量会引起常量。
调用类的静态方法
反射(Class.forName("com.jvm.test"))
初始化一个类的子类
java虚拟机启动时被表明为启动类的类(main 方法)
被动使用(不会导致类的初始化的)
所有java虚拟机实现必须在每个类或者接口被java程序首次主动使用的时候,才会初始化他们。
4. 类的加载
类的加载指江类的.class文件中的二进制数据,读入到内存中,将其放在运行时数据区的方法区内,然后再堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。
类加载器:
启动类加载器
扩展类加载器
系统类加载器
用户自定义类加载器
类的初始化时机
当java虚拟机初始化一个类时,要求他所有的父类都已经被初始化,但是这条规则并不适用于接口。
在初始化一个类时,并不会先初始化他所实现的接口。
在初始化一个接口时,并不会先初始化他的父接口。
因此,一个父接口并不会因为它的子接口或者实现类的初始化而初始化。只有当程序首次使用特定接口的静态变量时,才会导致该接口的初始化。
网友评论