java8API地址https://docs.oracle.com/javase/8/docs/api/
jvm8 地址https://docs.oracle.com/javase/specs/jvms/se8/html/
(1)通过一个类的全限定名获取定义此类的二进制字节流。
(2)将字节流所代表的静态存储结构转为方法区的运行时数据结构。
(3)在内存中生成代表此类的java.lang.Class对象,作为方法区中这个类的访问入口。
**确保字节流文件信息符合虚拟机规范,**保证类加载准确性,有格式、元数据、字节码验证等。
为类变量分配内存,初始化零值。(Static修饰的变量)
这里不包含final修饰的static,因为final修饰的会在编译时就分配了。准备阶段显示初始化。
类变量分配在方法区,实例变量随对象一起分配在堆内存。这里不会为实例变量分配初始化。
将常量池中的符号引用转为直接引用。
执行类构造器方法()的过程。此方法不需要定义,时虚拟机视角下的。此时会给类变量显示赋值。
一个类只能被加载一次。会被同步加锁。
什么情况下使用
类加载器收到类加载请求,首先向上找其父类,直到找到引导类,看起是否可以加载,不能则从引导类往下的子类进行尝试。
这样做的目的是类的加载首先去java核心类库中找是否有,核心类库的优先级最高,依次往下。
保证核心API源代码的保护,引导类加载器只加载核心API,不加载自定义的与核心API同名或同包名的API。
jvm中比较两个calss是否为同一类,存在两个必要条件:
灰色的PC程序计数器、本地方法栈、虚拟机栈是属于线程私有的。
红色的方法区和堆是属于进程的,同一个进程内的线程共享该内存。
线程是一个程序里的运行单元。JVM允许一个应用有多个线程并行执行。
在Hotspot中,java线程与操作系统的本地线程是有直接映射关系。一一对应。
作用: 用来存储指向下一条指令的地址。行号的表示。
生命周期 : 线程私有,生命周期与线程一致。
执行:任何时间,一个线程只执行一个方法,程序计数器会保存当前正在执行方法的JVM指令地址。若执行本地方法则为空。
无OutMemoryError情况:Java虚拟机规范中唯一一个不会内存溢出的内存。