JVM02_类加载器子系统、类加载过程

内存结构

JVM02_类加载器子系统、类加载过程_第1张图片

类加载子系统

JVM02_类加载器子系统、类加载过程_第2张图片

类加载过程

JVM02_类加载器子系统、类加载过程_第3张图片
JVM02_类加载器子系统、类加载过程_第4张图片
JVM02_类加载器子系统、类加载过程_第5张图片
链接阶段
JVM02_类加载器子系统、类加载过程_第6张图片
一个JVM能运行的class文件都是以CAFEBABE开头的
在这里插入图片描述

初始化阶段,理解记忆

JVM02_类加载器子系统、类加载过程_第7张图片
使用Binary Viewer 把字节码文件打开,这其中的字节码一个个翻译后就是ByteCode viewer的结果
JVM02_类加载器子系统、类加载过程_第8张图片
JVM02_类加载器子系统、类加载过程_第9张图片
类成员number声明在下边,赋值在上边,这种写法也是可以的
因为:在链接阶段准备时,就给类成员进行了分配内存并赋值为0,然后才从上到下赋值并覆盖,最终结果是10
JVM02_类加载器子系统、类加载过程_第10张图片
JVM02_类加载器子系统、类加载过程_第11张图片
变量number的声明发生在后边,在前边的静态代码块中可以赋值,但是不可以调用
JVM02_类加载器子系统、类加载过程_第12张图片
下边代码,因为此时没有类成员和静态代码块,所以不需要clinit,所以不产生clinit
JVM02_类加载器子系统、类加载过程_第13张图片
JVM02_类加载器子系统、类加载过程_第14张图片
此时如果加上一个类成员
JVM02_类加载器子系统、类加载过程_第15张图片
就产生clinit方法
JVM02_类加载器子系统、类加载过程_第16张图片
上边init就是构造器方法
子类的加载是在父类加载后
JVM02_类加载器子系统、类加载过程_第17张图片
在多线程下,一个类只能被加载一次
JVM02_类加载器子系统、类加载过程_第18张图片
JVM02_类加载器子系统、类加载过程_第19张图片

上边代码,两个线程,2先抢到,在执行到DeadThread类时出现死循环,一直跳不出,那线程1就没法进行,也就是说,DeadThread类只被加载了一次

加载同一个线程,会导致其他线程出现阻塞的状态,要避免

重新理解这个类加载过程
JVM02_类加载器子系统、类加载过程_第20张图片
面试能说清楚每个阶段的主要操作就可以

你可能感兴趣的:(JVM,jvm)