关于JVM

JVM

Java虚拟机(Java Virtual Machine,缩写:JVM),一种能够执行Java字节码的虚拟机,以堆栈结构机器来实现。最早由Sun微系统所研发并实现第一个实现版本,是Java平台的一部分

作为一种编程语言的虚拟机,实际上不只是专用于Java语言,只要生成的编译文件符合JVM对加载编译文件格式要求

JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行

内存模型

内存模型
image

方法区逻辑上是堆的一部分,但虚拟机的实现可能会区分两者,从而不对方法区进行垃圾回收
方法区用来存储类信息比如方法信息、构造信息等
每个Java虚拟机线程均有其自己的调用栈(Java虚拟机栈),用于存储帧。
当调用方法时,Java虚拟机将新建一个帧;方法退出时,帧将自动消除。
每帧均提供一个操作数栈及一个局部变量数组。
操作数栈用于计算操作数和接收被调用方法的返回值,而局部变量与寄存器的用途相同,也用于传递方法参数。
故Java虚拟机既是堆栈机器,也是寄存器机
image

从一个Java文件,从源码到内存的过程,再详细看内存模型:
其实分为2个子系统和2个区

  • 类加载子系统
  • 执行引擎子系统
  • 运行时数据区
  • 本地接口区
    image

类加载器

负责将java字节码加载到JVM的内存空间。

java 字节码是怎么来的,是由代码编译器对.java文件的源码进行编译,生成 java字节码,也就是 .class 文件
image

java 类的加载,不是一开始就加载,而是按需加载,也就是在第一次使用时加载

image

加载

JVM默认有3个加载器

  • 引导(Bootstrap)类加载器
    由原生代码(如C语言)编写,不继承自java.lang.ClassLoader
    负责加载核心Java库,比如 rt.jarjava.lang, java.net, java.util, java.io 等包下的类。还有 <JAVA_HOME>/jre/lib 目录下的库
  • 扩展(Extensions)类加载器
    加载 <JAVA_HOME>/jre/lib/ext 目录下的库
    sun.misc.Launcher$ExtClassLoader 实现
  • 应用(Application)类加载器(也称系统类加载器)
    加载 java.class.pathCLASSPATH环境变量下的库
    一般自定义加载器都继承 Application 加载器

JDK1.2后,引入了上级委派功能
image

好处:

  • 尽可能保证JDK的系统API不会被用户定义的类加载器所破坏
  • 保证类不被重复加载

类加载过程:
image

链接

链接是加载阶段的第二步,分3部分:验证、准备、解析

验证

Java可以在任何环境下安全地执行。怎么样实现这个安全的,就是在类加载链接的验证阶段。
主要验证:

  • Comes from a valid compiler 来自有效的编译器
  • Has correct structure 有正确的代码结构
  • Has correct formatting 有正确的代码格式
    通过上面几步验证,可以保证后续能安全执行。
    如果验证失败,.class 文件被认为是损坏或者更改了。JVM 将抛出验证失败的运行时异常

准备

如果类中定义了静态变量,则这个阶段会分配默认值。

值得注意的是,这里分配的是默认值,不是初始化值
比如 static int a = 100 则给 a 分配默认值 0。
其他类型为 boolean = false, double = 0.0d, char = '\u0000'

解析

解析阶段做的事:将符号链接替换为直接链接

因为编译后的class文件中,没法知道类引用的内存地址,所以只能用符号来定义。比如 User、Order 这些自定义的类。
而在解析阶段,就会将这些符号替换为真正的内存链接。
这也是整个链接阶段的重点,所以也是这个阶段为什么叫链接

初始化

变量赋值
执行静态代码块

虚拟机架构

数据运行方式

  • 整数
  • 浮点数
  • 引用

JVM本质上是一个32位的机器
booleanbytecharshort 都是使用符号扩充(char为符号扩充中的零扩展)以32位形式存储
int以32位形式存储
longdouble都是64位,在帧的局部变量或操作数栈中占用两个存储单元来代替64位存储(1个单元为32位)

boolean类型被视为8位byte值,0代表false,1代表true

对象创建过程

对象创建方式:
https://www.cnblogs.com/yangzhenlong/p/17943776

创建过程:
image

posted @ 2024-01-03 13:08  艺言弈行  阅读(7)  评论(0编辑  收藏  举报