JVM-1

今天简单整理了一下 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-1

jvm 类加载机制图2

JVM-1

下面详细介绍类的加载机制:

加载

加载主要是将.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;

/**
大专栏
上一篇:3.iOS 自定义 UILable Rect时,有时会上边或右边会显示一条细线的问题。


下一篇:类加载、对象实例化知识点一网打尽