【JVM】——JVM运行机制、类加载机制、内存划分

 8e19eee2be5648b78d93fbff2488137b.png

阿华代码,不是逆风,就是我疯

你们的点赞收藏是我前进最大的动力!!

希望本文内容能够帮助到你!!

目录

一:JVM引入

1:编程语言

2:JAVA运行机制

二:JVM中内存区域划分

1:堆

2:栈

(1)本地方法栈

(2)虚拟机栈

3:程序计数器

4:元数据区

三:JVM的类加载机制(重点 )

1:类加载

2:类加载过程

(1)加载

(2)验证

(3)准备

(4)解析

(5)初始化

3:双亲委派模型

(1)类加载器

(2)模型工作过程


一:JVM引入

IDEA运行代码离不开三个东西

JVM——Java虚拟机

JRE——Java运行时环境

JDK——Java开发工具包

③包含②,②包含①

1:编程语言

在计算机导论中,我们把编程语言可以分为:编译型语言和解释型语言(虽然现在不适用了)

编译型语言:将像JAVA或者C++这样的高级语言,转化为二进制的机器指令,最后由CPU进行执行

解释型语言:边转化二进制机器指令,CPU边执行

2:JAVA运行机制

Java属于“半编译,边解释”,目的是为了跨平台。我们知道不同的cpu,上面支持的指令格式并不一样。JAVA想要达到编译一遍,就能在多种CPU上执行。这里的过程简述如下

①通过javac把.java文件转化为.class文件

(.class文件就是字节码文件,包含的就是java字节码,可以理解成java自己搞的一套“CPU指令”)

②这个.class文件在某个具体的操纵系统上执行,此时JVM就会把.class文件转化为当前cpu能识别的机器指令。

(JVM相当于翻译官)

总结:我们编写和发布一个Java程序,只需发布一个.class文件就可以了,剩下的交给JVM(爹~!)

二:JVM中内存区域划分

JVM本身就是一个进程,在运行过程中就会向操作系统这里申请一些资源(内存),比如在Java中定义变量,就是jvm去申请内存空间

1:堆

代码中new出来的对象就是在堆里面;对象中持有的非静态成员变量也就是在堆里

2:栈

包含了方法的调用关系和局部变量

(1)本地方法栈

本地也就是jvm内部,通过c++写的代码中的一些调和关系和局部变量(关注较少)

(2)虚拟机栈

记录Java代码中(IDEA中)的调用关系和局部变量(一般说栈默认指虚拟机栈)

注:这里说的栈,和数据结构中的栈不是一回事

3:程序计数器

这个区域空间比较小,用来存储下一条要执行的java指令地址

4:元数据区

java1.8以前也叫“方法区”。我们写的代码,由javac转化为字节码,再由jvm把字节码加载到内存中放到元数据区(方法区)中,程序就按照元数据中记录的字节码依次执行

“元数据”(meta data)计算机术语,指的是一些辅助性性质的,描述性质的属性 

例如:类的信息,方法的信息,一个程序有哪些类,类里有哪些方法,方法中包含哪些指令

例如:文件大小、位置、拥有者、修改时间、

三:JVM的类加载机制(重点 )

1:类加载

指java进程运行时,把.class文件从硬盘读取到内存,并进行校验解析的过程

2:类加载过程

Java官方文档中有详细说明Java SE Specifications

(1)加载

找到硬盘上的.class文件,打开文件,读取文件内容(二进制数据)

(2)验证

确保读取到的数据内容是合法的.class文件(字节码文件)

①类型

c++中没有规定类型有多长,而是规定这个类型不能短于多长,所以程序员用typedef自己定义出一些类型,u4,u2就是在描述这个类型的长度

②magic

majic也叫做magic number 魔幻数字,广泛应用于二进制文件格式中,用来标识当前二进制文件的格式是哪种类型

③JVM内部的版本,高版本的JVM可以运行低版本的.class文件,反之不一定可以

 

④常量池

⑤针对类的修饰限定符只有public和default两种

⑥当前类的其它信息和父类息

⑦每一个元素就是一个field_info,描述每一个成员,属性的相关信息(属性的名字、类型,访问权限,)

 ⑧方法信息

⑨注解

(3)准备

给类对象申请内存空间,此时申请到的内存空间,里面的默认值都是0 

(4)解析

针对字符串常量进行处理——JVM将常量池中的符号引用替换为直接引用的过程,也就是初始化常量的过程

等.class文件被JVM加载到内存当中后,此时“hello”就有真实的地址了

(5)初始化

针对对象完成后续的初始化

3:双亲委派模型

双亲委派模型是处于加载环节中的,它描述的是如何查找.class文件

彩蛋:起“双亲”为名字,纯是为了好听,其实单亲更符合实际

(1)类加载器

在JVM中有一个专们进行类加载的模块——“类加载器”(ClassLoader)

默认的类加载器有三个:

①BootstrapClassLoader——负责查找标准库的目录

注:Java语法规范中描述了标准库中应该有哪些功能,像我们熟知的java.lang,java.util等就是标准库中的核心组件

②ExtensionClassLoader——负责查找扩展库的目录 

注:实现JVM的厂商/组织,会在标准库的基础上在扩展实现一些功能,这些功能就放在扩展库里

③ApplicationClassLoader——负责查找当前项目的代码目录和第三方库目录

注:上述三个类加载器,存在像二叉树里那种“父子关系”,有一个指针引用指向自己的“父亲”类加载器

(2)模型工作过程

①将ApplicationClassLoader作为入口进入,ApplicationClassLoader不会选择立刻在自己的目录开始搜寻,而是把任务交给自己的parent

②ExtensionClassLoader收到任务后,不会立刻搜索自己的目录,而是传给parent

③BootstrapClassLoader同样把任务甩给parent,但是发现parent是null,没有“父亲”

④所以只能自己搜寻了——尝试在标准库中搜寻符合要求的.class文件。如果找到了,就步入下一个验证环节;如果没找到就把任务返还孩子

⑤ExtensionClassLoader收到搜寻任务后同样再扩展目录中开始搜寻,如果找到了,就步入下一个验证环节;如果没找到就把任务返还孩子

⑥ApplicationClassLoader收到任务在当前项目代码目录和第三方库目录中找,如果找到了,就步入下一个验证环节;如果没找到就表示类加载失败抛出“ClassNotFoundException”异常

注:上述的规则,是JVM自带的类加载器默认遵循的规则。我们也可以自己写一个类加载器,打破上述规则(铁批表示规则就是用来打破的~~~)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1U服务器和Hyper-V虚拟机使用记录

记录最近接触服务器和虚拟机的一些使用操作知识 背景:1U服务器上架使用,备份其他服务器vm虚拟机,Hyper-V管理虚拟机使用测试 设备:IBM3550服务器交换机, 移动硬盘:附加存储盘, u盘1&#xff1…

go高并发之路——本地缓存

一、使用场景 试想一个场景,有一个配置服务系统,里面存储着各种各样的配置,比如直播间的直播信息、点赞、签到、红包、带货等等。这些配置信息有两个特点: 1、并发量可能会特别特别大,试想一下,一个几十万…

Anchor DETR:Transformer-Based目标检测的Query设计

写在前面 文中指出之前DETR-like算法存在以下问题: 之前DETR-liked检测算法里,object query是一组可学习的嵌入表示(就是一组256-d的向量),缺乏明确的物理意义,不能解释它们会关注什么地方。每个object q…

探索现代软件开发中的持续集成与持续交付(CI/CD)实践

探索现代软件开发中的持续集成与持续交付(CI/CD)实践 随着软件开发的飞速进步,现代开发团队已经从传统的开发模式向更加自动化和灵活的开发流程转变。持续集成(CI) 与 持续交付(CD) 成为当下主…

【SSM-Day5】SpringMVC

【SSM-Day5】SpringMVC Web->Servlet->Servlet容器MVC档案SpringMVC档案SpringMVC核心操作📢建立连接RequestMapping:实现路由映射Controller/ResponseBody:表示Spring某个类是否可以接收HTTP请求 📢接收请求1. 直接接收一个…

【skywalking 】选择Elasticsearch存储

介绍 skywalking支持 Elasticsearch 和 OpenSearch 作为存储。 OpenSearch 是 ElasticSearch 7.11 的一个分支,但在 Apache 2.0 中获得许可。 OpenSearch 存储与 ElasticSearch 共享相同的配置。为了激活 OpenSearch 作为存储,请将存储提供程序设置为e…

【QT】Qt窗口(上)

个人主页~ Qt窗口 一、菜单栏二、工具栏三、状态栏四、浮动窗口 Qt窗口是通过QMainWindow类来实现的,我们之前的学习是通过QWidget类实现的 QMainWindow包含一个菜单栏Menu Bar②,多个工具栏Tool Bars③,多个浮动窗口Dock Widgets&#xff0c…

关闭windows更新方法

在windows更新里选择暂停windows更新 然后按下winr,输入regedit 在注册表里找到 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings\PauseUpdatesExpiryTime 修改时间即可

【数据分享】中国汽车市场年鉴(2013-2023)

数据介绍 在这十年里,中国自主品牌汽车迅速崛起。吉利、长城、比亚迪等品牌不断推出具有竞争力的车型,在国内市场乃至全球市场都占据了一席之地。同时,新能源汽车的发展更是如日中天。随着环保意识的提高和政策的大力支持,电动汽车…

第十八届联合国世界旅游组织/亚太旅游协会旅游趋势与展望大会在广西桂林开幕

10月19日,第十八届联合国世界旅游组织/亚太旅游协会旅游趋势与展望大会(以下简称“大会”)在广西桂林开幕,来自美国、英国、德国、俄罗斯、柬埔寨等25个国家约120名政府官员、专家学者和旅游业界精英齐聚一堂,围绕“亚洲及太平洋地区旅游业&a…

Git 创建SSH秘钥

1、命令行输入 ssh-keygen -t rsa -b 4096 2、系统提示你“Enter a file in which to save the key”,直接按回车键 3、再提示你输入密码的时候直接按回车键,创建没有密码的SSH密钥 4、密钥对创建后,可以在自己电脑对应的 ~/.ssh 目录下找到…

【隐私计算篇】全同态加密应用场景案例(隐私云计算中的大模型推理、生物识别等)

1.题外话 最近因为奖项答辩,一直在忙材料准备,过程非常耗费时间和精力,很难有时间来分享。不过这段时间虽然很忙碌,但这期间有很多新的收获,特别是通过与领域内专家的深入交流和评审过程,对密码学和隐私计算…

今日头条APP移动手机端留痕脚本

这两个的脚本目的是什么呢? 很简单,就是批量访问指定用户的首页,在他人访客记录里面留下你的账户信息,可以让对方访问你的头条,概率下会关注你的头条,目的嘛,这个自己细想! 第1个是…

Python实现Android设备录屏功能及停止录屏功能

1、功能概述? 提供源码下载 之前通过ADB命令实现了实时的录屏功能。但是很遗憾,虽然通过adb命令录屏非常方便,但由于权限限制,无法在安卓系统较高的设备上使用。现选择使用另一开源工具来解决这一问题,并记录使用详细…

java jsoup爬虫如何快速获取到html页面的选择器元素

java jsoup爬虫如何快速获取到html页面的选择器元素 一、打开元素选择器二、选定元素三、定位元素位置四、右键 -> copy ->copySelector五、代码中获取 一、打开元素选择器 在java采用jsoup爬虫中,返回的是html页面而不是json字段,就需要使用jsou…

[C++11] 右值引⽤与移动语义

文章目录 左值和右值左值(Lvalue)右值(Rvalue)区别 左值引⽤和右值引⽤左值引用(Lvalue Reference)右值引用(Rvalue Reference)右值引用的特点 右值引用延长生命周期右值引⽤和移动语…

传输层UDP

再谈端口号 端口号:标识了主机上进行通信的不同的应用程序 在TCP/IP 协议中我们用“源IP”"源端口号" “目的IP”“目的端口号” “协议号”五元组来标识一个通信 用netstat -n 查看 查看网络信息,我们有两种命令查看网络通信1.用netsta…

Linux-练习3

题目: 操作过程: 1.建立用户组 shengcan,其id 为 2000 2.建立用户组 caiwu,其id 为 2001 3.建立用户组 jishu,其 id 为 2002 4.建立用户 lee,指定其主组 id 为 shengchan,附加组为 jishu 和…

多GPU训练大语言模型,DDP, ZeRO 和 FSDP

在某些时候,我们可能需要将模型训练扩展到单个 GPU 之外。当模型变得太大无法适应单个 GPU 时,需要使用多 GPU 计算策略。但即使模型适合单个 GPU,使用多个 GPU 来加速训练也是有好处的。即使您正在处理一个小模型,了解如何在多个…

在浏览器中运行 Puppeteer:解锁新能力

Puppeteer,这个强大的浏览器自动化工具,通常在Node.js环境中运行。但你有没有想过,在浏览器本身中运行Puppeteer会是什么样子?这不仅能让我们利用Puppeteer的功能完成更多任务,还能避开Node.js特定的限制。 支持的功…