JVM加载
2020-11-10 09:40:36 0 举报
Java加载流程图
作者其他创作
大纲/内容
HelloWorld.java
老年代(2/3)
运行时数据区(内存模型)
调用LoadClass方法加载要运行的类HelloWorld
compute()-栈贞
HelloWorld.main()
创建一个引导类加载实例C++实现
1、引导类加载器(C++实现)2、启动器Launcher3、创建其他类加载器(扩展类加载器以及应用类加载器)
加载:在硬盘上查找并通过IO读入字节码文件至JVM虚拟机方法区,同时在堆中创建class对象验证:校验字节码文件的正确性准备:为类的静态变量分配内存,并将其初始化为默认值,此阶段仅仅只为静态类变量(即static修饰的的字段变量)分配内存,并且设置该变量为初始值。(比如 static int num=5这里只将num初始化为0,5的值将会在初始化时赋值),对于final static 修饰的变量编译的时候就会分配了,也不会分配实例变量的内存。解析:把类中的符号引用转化为直接引用初始化:对类的静态变量初始化为指定的值,执行静态代码块
方法调用文件.dll
初始化
main线程
类装载子系统
局部变量表
main()-栈贞
获取运行类自己的ClassLoader默认为AppClassLoader的实例
a=1
JVM虚拟机
堆
本地方法栈
HelloWorld.class
连接
加载实例的时候JVM会执行HelloWorld类的main方法入口
程序计数器=4
解析
C++调用Java代码创建JVM启动器的实例sum.misc.Launcher该类由引导类加载器负责加载同时创建其它类加载器
Java程序运行结果
验证
动态链接
方法区
栈(线程)
堆内存
年轻代
class对象
准备
方法出口
方法区(元空间)
程序计数器
java com.ant.load.HelloWorld
S0(2/3)
window系统下java.exe调用应用的jvm.dll文件创建java虚拟机(C++)实现
java命令
Survivor区
this
字节码二进制数据
b
操作数栈
Java虚拟机内存
字节码执行引擎
sun.misc.Launcher.getLauncher()
Eden(2/3)
classLoader.loadClass(\"com.ant.load.HelloWorld\")
常量+静态变量+类信息
FIFO
加载
javac Math.java
javac命令
2
S1(2/3)
launcher.getClassLoader()
JVM销毁
java Math.class
0 条评论
下一页