Java虚拟机原理
jdk1.8之前的内存结构
jdk1.8y以后的内存结构
JDK 1.6:程序计数器、Java虚拟机栈、本地方法栈、堆、方法区[永久代](字符串常量池、静态变量、运行时常量池、类常量池)
JDK 1.7:程序计数器、Java虚拟机栈、本地方法栈、堆(字符串常量、静态变量)、方法区[永久代](运行时常量池、类常量池)
JDK 1.8:程序计数器、Java虚拟机栈、本地方法栈、堆(字符串常量)、元数据(静态变量、运行时常量池、类常量池)
jdk类加载
类加载过程详解
Java中一个类从它的class文件被加载进入虚拟机到被JVM卸载,其生命周期大致可以分为以下几步:
类的生命周期
类从被加载到虚拟机内存到开始卸载出内存为止,生命周期可以简单概括为7个阶段:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)。其中,前三个阶段可以统称为连接(Linking)。
JDK默认实现
JDK中对于类加载流程的默认实现就是大名鼎鼎的双亲委托机制,双亲委托加载机制是一个分层次的类加载机制,不同的类加载器负责加载不同的类。
JDK默认的实现中相关的类加载器主要有Bootstrap ClassLoader 、Extension ClassLoader、Application ClassLoader。
具体的加载流程:当一个类被加载时,默认会调用Application ClassLoader,但AppClassLoader并不会直接加载该类,而是通过parent变量找到其父类加载器(Extension ClassLoader),委托给其父类进行加载,ExtClassLoader会委托给Bootstrap ClassLoader,Bootstrap CLassLoader没有父类了。此时Bootstrap CLassLoader会对需要加载类尝试进行加载,如果无法加载则返回ExtClassLoader进行加载。
同理,如果ExtClassLoader无法加载则返回AppClassLoader进行加载,如果AppClassLoader也无法加载则抛出ClassNotFoundException异常。上述过程有一个类加载器可以完成相关加载任务,则加载成功,存放其元数据并创建Class对象(JDK8之后Class对象是在堆区)。