关于JVM

发布时间 2024-01-03 13:13:50作者: fix-bugs

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 文件

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

JVM默认有3个加载器

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

JDK1.2后,引入了上级委派功能
好处:

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

类加载过程:
image

虚拟机架构

数据运行方式

  • 整数
  • 浮点数
  • 引用