上图是整个.java 整个启动过程;
1 .java
是Java 编译器认识的原文件(偏向人类思维的文件)
顺带说下 编译器:将一种语言文件 转化为另一种的计算机可认知的语言规范,
2 .Class
经过 编译器编译成jvm认识的字节码文件,是Java 虚拟机认识可加载的文件,
class 有两者数据结构:
- u : 代表基本类型和无符号数据
- _info:多个无符号数据和其他info 表的 共同构成的表,classs 本身也是info 表
info 表内的结构🈶️一定顺序组成,并是固定顺序 魔数-》版本号-》常量池-》访问标记-》类/父类/接口-》字段描述集合-》方法描述集合-》属性描述集合
- 魔数:用来标记是否是 class
- 版本号:用来标记class 文件的所对应的版本号
- 常量池:类的名称、父类的名称、类中的方法名、参数名称、参数类型,具体的tag代表,可以去官网查看
- 访问标记:类,常量等的访问信息等;
- 类/父类/接口;访问标志代表类或者接口的访问信息,比如:该 class 文件是类还是接口,是否被定义成 public,是否是 abstract,如果是类,是否被声明成 final 等等
- 字段描述: 字段的相关信息,名字和类型,权限等;
- 方法描述:和字段描述类似
- 属性描述: 方法内字段的属性信息 对应的信息如何查,可以去Java 虚拟机相关表内去查字典
3. 虚拟机栈
jvm 运行时期私有的栈;长伴随,
- StackOverFlowError: 请求的栈深度过深
- OutOfMemoryError:内存溢出
存放在栈内的叫栈桢,栈桢是数据结构(桶形式),存储执行虚拟机方法(标记执行); 每个栈桢内包含:
- 常量区: 存放方法的常量
- 操作栈: 执行操作方法的行为记录
- 动态链接:一个方法的标记在方法内存中,另一个方便调用
- 返回方法区: 一个方法结束,返回到开始的地方,执行程序的顺性执行
4. 程序计数器
当多cpu 多线程的对同一方法的时,来标记程序运行的进度,当切回线程运行
5. 本地方法栈
本地方法栈和上面介绍的虚拟栈基本相同,只不过是针对本地(native)方法。在开发中如果涉及 JNI 可能接触本地方法栈多一些,在有些虚拟机的实现中已经将两个合二为一了——HotSpot
6 堆
性质:共享 我们比较了解的jvm 比较大的内存,存放实例对象:由于对象大量存在,所以也是GC 垃圾回收器的主战场,我们也可以说是GC堆,
方法区
性质:共享 类信息(版本、字段、方法、接口)、常量、静态变量、即时编译器编译后的代码和数据