JVM 虚拟机

JVM 是 Java Virtual Machine 的简称,意为 Java 虚拟机,虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。 常见的虚拟机有:JVM、VMwave、Virtual Box等。JVM 是一台被定制过的现实当中不存在的计算机;

一、JVM 执行流程

JVM 是 Java 运行的基础,也是实现一次编译到处执行的关键;程序在执行前,首先要将 Java 代码(.java 文件)编译为字节码(.class 文件),JVM 把编译后的字节码通过类加载器(ClassLoader)—— 把文件加载到内存中的 —— 运行时数据区(Runtime Data Area),而字节码文件是 JVM 的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解释器 —— 执行引擎(Execution Engine)将字节码翻译为底层系统指令再交给 cpu 去运行,而这个过程需要调用其他语言的接口 —— 本地库接口(Native Interface)来实现;

即 JVM 主要通过以下四部分来执行 Java 程序;

类加载器,运行时数据区,执行引擎,本地库接口;

二、JVM 内存区域划分

一个运行起来的 Java 进程,需要从操作系统中申请一块内存区域;

JVM 运行时数据区域也叫内存区域,由以下 5 大部分组成:

1. 方法区 / 元数据区(线程共享)

用来存储被虚拟机加载的类信息、常量池、静态变量、即时编译器编译后的代码等数据;

常量池存放字面量和符号引用:

字面量:字符串常量(JDK 8 移动到了堆中),final 常量,基本数据类型的值;

符号引用:类和结构的完全限定名、字段的名称和描述符、方法的名称和描述符;

2. 堆区(线程共享)

程序中创建的所有对象都在保存在堆中,堆里面分为两个区域:新生代和老年代,新生代放新建的对象,当新生代的对象经过一定 GC 次数之后还存活的对象会放入老年代

3. 虚拟机栈(线程私有)

Java 虚拟机栈的生命周期和线程相同,Java 虚拟机栈描述的是 Java 方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息;

1)局部变量表:存放了编译器可知的各种基本数据类型(8 大基本数据类型)、对象引用,局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在执行期间不会改变局部变量表大小;简单来说就是存放方法参数和局部变量

2)操作栈:每个方法会生成一个先进后出的操作栈;

3)动态链接:指向运行时常量池的方法引用;

4)方法返回地址:PC 寄存器的地址;

4. 本地方法栈(线程私有)

本地方法栈和虚拟机栈类似,本地方法栈是给本地方法(用 native 关键字修饰,在 JVM 内部通过 C++ 实现)使用的,即存放了 JVM 内部 C++ 方法的调用关系

5. 程序计数器(线程私有)

用来记录当前线程执行的行号的,程序计数器是一块比较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器;

三、类加载过程

一个类的生命周期如下:

其中前五步都属于类加载的过程;

1. 加载 

根据全限定类名找到该类的字节码文件,并在内存中生成一个代表这个类的 java.lang.Class对象,作为方法区这个类的各种数据的访问入口;

2. 验证

字节码文件是一个二进制格式的文件,需验证当前字节码格式是否符合 Java 虚拟机规范的全部要求,保证字节码中信息被当作代码运行后不会危害虚拟机自身的安全;

3. 准备

为类对象分配内存空间,但并不赋值(真正初始化赋值是在初始化阶段);例如下面的代码:

public static int num = 100;

这个阶段之后,num 的值为 0,而非 100;

但如果是 static final 修饰的基本数据类型的直接赋值方式,或 String 类的直接赋值方式,则会直接在该阶段初始化并赋值;例如

public static final int num = 100;

public static final String str = "abc";

此时 num 的值就是 100,str 的值为 "abc"; 

4. 解析

针对类对象中包含的字符串常量进行初始化操作;

String s = "abc";

s 的初始化语句,会先被设置为一个 "文件的偏移量",当类真正被加载到内存时,再把偏移量替换为真正的内存地址,这个过程也称为将符号引用替换为直接引用; 

5. 初始化

Java 虚拟机真正开始执行类中编写的 Java 程序代码,真的类对象进行初始化,加载父类包括类对象的各个属性,static 成员,静态代码块;

会导致类的初始化的情况

  1. 首次访问这个类的静态变量或静态方法时(由于 main 方法是程序的入口方法,并且main 方法是 static 的,所以 main 方法所在的类,会被首先初始化,但也遵循第 2 条);
  2. 子类初始化,如果父类还未初始化,会先初始化父类; 
  3. 子类访问父类的静态变量,只会触发父类的初始化;
  4. new 会导致初始化;

不会导致类的初始化的情况: 

  1. 访问类的 static final 静态常量(基本类型和字符型)不会触发初始化;
  2. 类对象.class 不会触发初始化;
  3. 创建该类的数组时不会触发初始化;

四、双亲委派模型

双亲委派模型:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每⼀个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去完成加载;(查找类的优先级问题) 

类加载器要做的就是根据给定类的全限定类名(包名+类名,例如 java.lang.String)找到其对应的字节码文件,对应类加载过程中的第一步;

JVM 内置了三个类加载器,分别是

启动类加载器:BootStrap ClassLoader;

扩展类加载器:Extension ClassLoader;

应用程序类加载器:Application ClassLoader;

这三个类由上到下是 "爷,父,子" 的关系,但并不是继承的关系,而是 ClassLoader 中,有一个 parent 属性,指向了它的 "父加载器";

若开发人员想要自己实现一个类加载器,需要继承 java.lang.ClassLoader 抽象类;

由一个类的全限定类名,找该类的字节码文件的过程大致如下:

1)从 Application ClassLoader 作为入口,开始查找,Application ClassLoader 负责搜索项目目录和第三方库目录,但是它不会立即寻找,而是交给它的父亲 Extension ClassLoader;

2)Extension ClassLoader 负责 JDK 中扩展的库的目录,但是它也不会立即寻找,而是交给它的父亲 BootStrap ClassLoader;

3)BootStrap ClassLoader 负责标准库的目录,此时,如果在标准库中找打了,则开始读取该字节码文件,若没有找到,则返回给它的孩子寻找;

若最终 Application ClassLoader 也没有找到该类,则会抛出 ClassNotFoundException

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/688700.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

流量录制学习

AREX Cloud | AREX (arextest.com) 流量录制学习,比vivo的moonbox要好用

【QT5】<总览四> QT常见绘图、图表及动画

文章目录 前言 一、QFile类读写文件 二、QPainter绘简单图形 三、QChart图表 四、QPropertyAnimation属性动画 五、Q_PROPERTY宏简介 六、自定义属性动画 前言 承接【QT5】<总览三> QT常用控件。若存在版权问题,请联系作者删除&#…

C语言过度C++语法补充(面向对象之前语法)

目录 1. C相较于C语言新增的语法 0. C 中的输入输出 1. 命名空间 1. 我们如何定义一个命名空间? 2. 如何使用一个命名空间 3. 命名空间中可以定义什么? 4. 在 相同或者不同 的文件中如果出现 同名的命名空间 会如何? 5. 总结~~撒花~~…

社区服务支持

社区服务支持 原创 小王搬运工 时序课堂 2024-06-07 19:29 四川 🌟 邀请函 | 加入我们的时序数据挖掘社区 🚀 尊敬的数据爱好者们, 我们诚挚地邀请您加入我们的专业社区——时序数据挖掘社区,一个专注于时序数据分析、挖掘与应…

网络空间安全数学基础·同余式

6.1 剩余系&#xff08;掌握&#xff09; 6.2 同余式概念与一次同余式&#xff08;熟练&#xff09; 6.3 中国剩余定理&#xff08;熟练&#xff09; 6.1 剩余系 设m是正整数&#xff0c;模m同余的全体整数是一个模m剩余类&#xff0c;即可表示为a qmr&#xff0c; 0≤r<…

ssti模板注入

一、Flask应用 1、介绍 定义 Flask&#xff1a;是一个使用Python编写的轻量级web应用框架。Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。 特点 良好的文档、丰富的插件、包含开发服务器和调试器、集成支持单元测试、RESTful请求调度、支持安全cookies、基于Unicode。 …

Go微服务: 关于TCC分布式事务

TCC 分布式事务 T: Try 预处理, 尝试执行&#xff0c;完成所有的业务检查&#xff0c;做好一致性&#xff0c;预留必要的业务资源&#xff0c;做好准隔离性C: Confirm 确认&#xff0c;如果所有的分支Try都成功了, 就到了这个阶段, Confirm 是真正执行业务的过程, 不做任何业务…

VCS基本仿真

这里记录三种仿真方式&#xff1a; 第一种是将verilog文件一个一个敲在终端上进行仿真&#xff1b; 第二种是将多个verilog文件的文件路径整理在一个文件中&#xff0c;然后进行仿真&#xff1b; 第三种是利用makefile文件进行仿真&#xff1b; 以8位加法器为例&#xff1a; …

[Bug]使用Transformers 微调 Whisper出现版本不兼容的bug

错误的现象 ImportError Traceback (most recent call last) <ipython-input-20-6958d7eed552> in () from transformers import Seq2SegTrainingArguments training_args Seq2SeqTrainingArguments( output_dir"./whisper-small-…

第九篇——冗余量:《史记》和《圣经》那个信息量大?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 通过信息量的对比&#xff0c;引出来冗余度的概念&#xff0c;又深入浅出…

webman中创建udp服务

webman是workerman的web开发框架 可以很容易的开启udp服务 tcp建议使用gatewayworker webman GatewayWorker插件 创建udp服务: config/process.php中加入: return [// File update detection and automatic reloadmonitor > [ ...........], udp > [handler > p…

小米开放式耳机怎么样?倍思、西圣、小米开放式耳机测评比较!

作为一名热衷于分享真实体验的博主&#xff0c;我在过去两年开始接触开放式耳机&#xff0c;并因此受到许多朋友的咨询&#xff0c;询问哪款开放式耳机更加出色。为了找出最佳的开放式耳机&#xff0c;我进行了深入的调查和实地测试。我发现高价并不总是代表高质量&#xff0c;…

计算机网络 期末复习(谢希仁版本)第3章

对于点对点的链路&#xff0c;目前使用得最广泛的数据链路层协议是点对点协议 PPP (Point-to-Point Protocol)。局域网的传输媒体&#xff0c;包括有线传输媒体和无线传输媒体两个大类&#xff0c;那么有线传输媒体有同轴电缆、双绞线和光纤&#xff1b;无线传输媒体有微波、红…

应急管理大数据指挥中心解决方案(51页PPT)

方案介绍&#xff1a; 本应急管理大数据指挥中心解决方案充分利用了大数据技术的优势&#xff0c;实现了信息的快速收集、分析和决策支持。通过数据融合、协同指挥、智慧化决策和平台建设等方面的努力&#xff0c;提高了应急管理的效率和准确性&#xff0c;为应对各类突发事件…

eclipse连接后端mysql数据库并且查询

教学视频&#xff1a;https://www.bilibili.com/video/BV1mK4y157kE/?spm_id_from333.337.search-card.all.click&vd_source26e80390f500a7ceea611e29c7bcea38本人eclipse和up主不同的地方如下&#xff0c;右键项目名称->build path->configure build path->Libr…

Ubuntu server 24 (Linux) AdGuard Home +SmartDNS 安装配置 搭建去广告快速DNS

一 SmartDNS 安装 &#xff0c;可参考&#xff1a;Ubuntu server 24 (Linux) 安装部署smartdns 搭建智能DNS服务器-CSDN博客 二 安装AdGuard 1 下载地址&#xff1a;GitHub - AdguardTeam/AdGuardHome: Network-wide ads & trackers blocking DNS server 2 解压安装 #下…

算法金 | 不愧是腾讯,问基础巨细节 。。。

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 最近&#xff0c;有读者参加了腾讯算法岗位的面试&#xff0c;面试着重考察了基础知识&#xff0c;并且提问非常详细。 特别是关于Ada…

路由器重启真的好吗?多久重启一次更好?

前言 小白前段时间发现自己家的OpenWRT软路由上网特别慢&#xff0c;有时候通话还有点卡顿。 然而有个朋友用的普通路由器也有类似的问题&#xff0c;而且有时候根本上不去网。 解决的办法很简单&#xff1a;重启路由器。 重启路由器&#xff1f; 但路由器重启是真的好吗&a…

吊车报警的工作原理和使用场景_鼎跃安全

在现代建筑施工过程中&#xff0c;经常使用大型机械设备&#xff0c;如挖掘机、吊车、打桩机等&#xff0c;这些设备在施工过程中发挥着越来越重要的作用&#xff1b;同时&#xff0c;这些设备的作业频繁进行作业&#xff0c;对于接触到高压电线的风险也随之增加。大型机械设备…

R语言探索与分析14-美国房价及其影响因素分析

一、选题背景 以多元线性回归统计模型为基础&#xff0c;用R语言对美国部分地区房价数据进行建模预测&#xff0c;进而探究提高多元回 归线性模型精度的方法。先对数据进行探索性预处理&#xff0c;随后设置虚拟变量并建模得出预测结果&#xff0c;再使用方差膨胀因子对 多重共…