今天简单整理了一下 JVM 的类加载机制,主要参考文献:
一道面试题搞懂JVM类加载机制
How JVM Works – JVM Architecture?
先看这道面试题:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
package com.heima.jvm; /** * @author created by qwb on 2018/10/6 15:19 */ public class test { public static void main(String[] args) { Singleton singleton = Singleton.getInstance(); System.out.println("Singleton1 value1: "+ singleton.value1); System.out.println("Singleton1: "+singleton.value2); Singleton2 singleton2 = Singleton2.getInstance2(); System.out.println("Singleton2 value1: "+singleton2.value1); System.out.println("Singleton2 value2: "+singleton2.value2); } } class Singleton{ private static Singleton singleton = new Singleton(); public static int value1; public static int value2= 0; private Singleton(){ value1++; value2++; } public static Singleton getInstance(){ return singleton; } } class Singleton2{ public static int value1; public static int value2 = 0; private static Singleton2 singleton2 = new Singleton2();//与Singleton1的位置不同 private Singleton2(){ value1++; value2++; } public static Singleton2 getInstance2(){ return singleton2; } } /** * Singleton1 value1: 1 Singleton1: 0 Singleton2 value1: 1 Singleton2 value2: 1 * */
类加载机制图1
jvm 类加载机制图2
下面详细介绍类的加载机制:
加载
加载主要是将.class文件(并不一定是.class。可以是ZIP包,网络中获取)中的二进制字节流读入到JVM中。 在加载阶段,类加载器读取 .class 文件,生成相关联二进制数据,并把它保存在方法区。对于每一个 .class 文件, JVM 保存类的以下信息 到方法区:
所加载类的全限定名以及它的直接父类
.class 文件相关的类、接口、枚举
修饰符、变量、方法信息等
在加载 .class 文件后,JVM 在堆内存里新建一个 Class 类型的对象,去代表这个 .class 文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
package com.heima.jvm; import java.lang.reflect.Field; import java.lang.reflect.Method; /** 大专栏