JVM虚拟机详解

JVM

虚拟机(Virtual Machine)是一台虚拟的计算机。VMware属于系统虚拟机,是对物理计算机的仿真。Java虚拟机是程序虚拟机,为专门执行某个单个计算机程序而设计,在Java中执行的指令我们称为Java字节指令码。

jvm作用:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cw4ohv9C-1662022893347)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\1660364622620.png)]

Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器码指令执行。

特点:一次编译,自动内存管理,自动垃圾回收功能。

JVM四个组成部分:

1、类加载器系统(Class Loader):负责从硬盘上加载字节码文件。

2、运行时数据区(Runtime Data Area):存储运行时数据,包含方法区,堆,栈,本地方法栈,程序计数器。

3、执行引擎(Execution Engine):负责将字节码解释/编译为真正的机器码。

4、本地方法接口(Native Interface):负责调用操作系统本地方法。

我们常说的JVM组成指的是运行时数据区里面的Heap(堆)模块。

类加载子系统
字节码文件存储在硬盘中,运行时,由类加载系统将类的信息加载在到内存中(方法区)。

类加载角色
class file存在于硬盘中,是一个模板,加载到JVM中,被称为DNA元数据模板,存放在方法区。类加载子系统负责将文件从文件系统或者网络中加载class文件,class->JVM->元数据模板,使用的是ClassLoader进行加载,充当一个快递员的角色。

类加载过程
1、加载(Loading)

将硬盘字节码读入到内存中,生成此类的Class对象,把硬盘上的结构转为内存结构。

2、链接(Linking)

第一,验证(Verification)

​ 验证字节码格式,是否被修改或者污染。

​ 验证语法,例如类是否继承final的类。

第二,准备(Preparation)

​ 在准备阶段为类中静态的变量赋予初始值,并设置默认初始值。不包含用final修饰的static常量,在编译时进行初始化。例如:public static int value = 123; value在准备阶段后的初始值不是123,是0.

第三,解析(Resolution)

​ 将类的二进制数据中的符号引用替换成直接引用,符号引用是Class文件的逻辑符号,直接引用是指向方法区中的实际地址。

3、初始化(Initialization)

什么时候初始化?

​ 1、new一个对象,创建类的实例

​ 2、访问某个类或接口的静态变量或者对该静态变量赋值

​ 3、调用类的静态方法

​ 4、反射,Class.forName(" ")

​ 5、初始化一个类的子类,先会初始化子类的父类

类的初始化顺序

对static修饰的变量或语句进行赋值。如果包含多个静态变量和静态代码块,按照自上而下顺序依次执行。如果初始化一个类的时候父类未初始化,则先初始化父类。

父类static->子类static->父类构造方法->子类构造方法。

类加载器分类
类加载器是负责加载类的类。

从JVM的角度上分为:

1、启动类加载器(引导类加载器),这部分不是用Java写的。

2、其他类加载器。这部分只用Java写的类加载器。
Java虚拟机栈(Java Virtual Machine Stacks)
单个线程私有,栈是运行时的单位,即栈解决程序的运行问题,即程序如何执行或如何处理数据。Java虚拟机栈也叫Java栈,每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个栈帧,对应着一次方法的调用。Java虚拟机栈主管Java程序的运行,它保存方法的局部变量(8中基本数据类型,对象的引用地址),部分结果并参与方法的调用和返回。

栈运行原理

1、JVM对Java栈的操作只有两个:调用方法入栈和执行结束后出栈。遵循先进后出/后进先出原则。

2、在一条活动的线程中,一个时间点上,只会有一个活动栈,即只有当前在执行的方法的栈帧(栈顶)时有效的,这个栈帧被称为当前栈,与当前栈对应的方法称为当前方法,定义当前方法的类叫当前类。

3、执行引擎运行的所有字节码指令只针对于当前栈帧进行操作。

4、如果在该方法中调用了其他方法,对应新的栈帧就会被创建出来,放在栈的顶端,成为新的当前栈帧。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值