JVM学习之路(一)----初识JVM

1.JVM是什么

JVM全称Java Virtual Machine,也叫作Java虚拟机,是Java程序运行的必不可少的环境,它可以将为class字节码文件编译为机器识别码来实现跨平台运行,所以JVM是JRE的一部分。

2.OOP-Klass模型

Klass是Java类在JVM中的一种存在形式,可以说每个Java类在JVM中都有与之相对应的实例,而这个实例 就是 Klass。

Klass模型图如下Klass模型

① InstanceKlass

储存java类的元信息

  1. InstanceMirrorKlass

学名:镜像类,用于表示java.lang.Class,java中的类即是对应着C++中的这个实例,存储在堆中(大家都知道,java对象在JVM就是存储在堆内存的)<

  1. InstanceRefKlass

java.lang.ref.Reference的子类,其余解释待补充

  1. InstanceClassLoaderKlass

解释待补充

② ArrayKlass

储存java数组的元信息

  1. TypeArrayKlass

是代表基本数据类型的数组(八大基本数据类型)
在这里插入图片描述

  1. ObjArrayKlass

是代表引用类型的数组
在这里插入图片描述

3.类的加载过程

类的加载过程一般分为七个阶段

在这里插入图片描述

我们接下来谈谈这七个阶段分别做了哪些工作

  1. 加载

1.根据全限定名(即包名+类名)找到class文件
2.解析为运行时数据,即InstanceKlass实例,存放在方法区
3.在堆内存中生成class对象,即InstanceMirrorKlass实例(镜像类)

因为没有指明必须从哪获取class文件,脑洞大开的工程师们开发了这些
1、从压缩包中读取,如jar、war
2、从网络中获取,如Web Applet
3、动态生成,如动态代理、CGLIB
4、由其他文件生成,如JSP
5、从数据库读取
6、从加密文件中读取

那么何时才会进行类的加载工作呢?

答案当然就是:主动加载时才会进行加载

主动加载的场景有:
1.反射
2.初始化一个子类需要加载父类的时候
3.启动类(Main函数所执行的类)
4.new、getstatic、putstatic、invokestatic

当然除了主动加载场景外,还有预加载的几个特例

包装类、String、Thread

  1. 验证

1、文件格式验证
2、元数据验证
3、字节码验证
4、符号引用验证

  1. 准备

静态变量分配内存控制、赋初值。
Java类中的实例变量,一般都是在类加载的时候才会赋值,所以没有“赋初值”这么一说。

基本数据类型的初值是按照下表规则来初始化的
基本数据类型初值是按照这个规则来初始化的
如果被final关键字修饰,那这个值会被加上ConstantValue,即在准备阶段就完成赋值,就没有赋初值这一步,属于直接引用
4. 解析
间接引用 —>直接引用

  1. 初始化

1.执行静态代码段
2.定义一个static的属性,在JVM中会自动生成一个clinit方法(可以理解为生成静态代码段,供初始化时执行

代码顺序跟定义的代码顺序是保持一致的

  1. 使用
  2. 卸载
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值