JVM--类加载过程

2018-10-13  本文已影响0人  truemi

JVM

定义

java虚拟机(java virtual Machine)是用于运行java应用程序的虚构个计算机.

作用:

是java程序"一次编译,到处运行"的关键,java程序编译时,不是直接编译成目标机器的机器码,而是编译成.class的二级制的字节码文件,再由目标机器上的JVM虚拟机把.class文件翻译为对应机器的机器码执行.

内存结构

五个部分:

JVM类加载过程

  1. 加载
  2. 验证
  3. 准备
  4. 解析
  5. 初始化

加载
"加载"就是将.class文件读到内存中,“加载”的动作主要在classLoader.cpp(指包含类的子类)和classFileParser.cpp文件中实现

验证

加载和验证是交叉进行的,验证在各个阶段都是存在的,验证二进制字节流代表的字节码文件是否合格,主要从一下几方面判断:

文件格式:参看class文件格式详解,经过文件格式验证之后的字节流才能进入方法区分配内存来存储。
元数据验证:是否符合java语言规范
字节码验证:数据流和控制流的分析,这一步最复杂
符号引用验证:符号引用转化为直接引用时(解析阶段),检测对类自身以外的信息进行存在性、可访问性验证

准备
“准备”阶段是为class或者interface中的静态变量赋初始值,如果常量无初始值,则默认赋值为java基本数据类型的默认值

类型 描述
byte 8位补码表示,默认值为0
byte 用8位补码表示,初始化为0
short 用16位补码表示,初始化为0
int 用32位补码表示,初始化为0
long 用64位补码表示,初始化为0L
char 用16位补码表示,初始化为”u0000”,使用UTF-16编码
float 初始化为正0
double 初始化为正0
boolean 初始化为0
returnAddress 初始化为字节码指令的地址,用于配合异常处理特殊指令

解析
解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程

1.类或接口的解析
2.字段解析
3.类方法解析
4.接口方法解析

初始化
类初始化阶段是类加载过程的最后一步,到了这个阶段才真正开始执行类中定义的Java程序代码(或者说是字节码)。在准备阶段,变量已经赋过一次系统要求的初始值,而在初始化阶段,则根据程序员通过程序制定的主观计划去初始化类变量和其他资源。

上一篇 下一篇

猜你喜欢

热点阅读