2023.9.1 简单认识 JVM

news2024/11/20 22:39:43

目录

JVM 内存划分

本地方法栈

虚拟机栈

程序计数器

堆区

元数据区

JVM 类加载机制

加载

验证

准备

解析

初始化

类被加载的几种情况(懒汉模式 ---> 只要被用到才会被加载)

双亲委派模型


JVM 内存划分

  • JVM 是一个应用程序,在它启动的时,需要从操作系统中申请内存一部分内存区域!
  • 每个 JVM 就是一个 Java 进程

划分图:


本地方法栈

  • 本地则表示 JVM 内部的 C++ 代码,就是给调用本地方法(JVM 内部的方法)所准备的栈空间

虚拟机栈

  • 给 Java 代码使用的栈空间,用来存储局部变量、方法参数、返回值 等
注意:
  • 此处的栈跟数据结构中的栈不是同一个东西
  • 数据结构的栈是一个通用的,更广泛的概念,此处的栈特指 JVM 中的一个特定空间
  • 本地方法栈 存储本地方法之间的调用关系
  • 虚拟机栈 存储方法之间的调用关系
  • 整个栈空间包含多个栈帧,每个栈帧表示一个方法,其中包含方法的入口地址、参数、返回地址、局部变量等
  • 每个线程都有自己独立的栈

程序计数器

  • 存储当前线程执行的字节码指令地址,记录当前线程执行到哪个指令,每个线程都有自己独立的程序计数器

堆区

  • 堆是 JVM 中最大的一块内存区域,用于存储对象实例和数组,一个进程只有一份,被所有线程共享,通过垃圾回收来管理内存的分配与释放

元数据区

  • 用来存储类的信息、常量、静态变量、静态成员 等 

总结:

  • 局部变量在栈上
  • 普通成员变量在堆上
  • 静态成员变量在元数据区上

JVM 类加载机制

  • 指将类的字节码(.class文件)加载到内存中(元数据区),并在运行时将其转换为可执行的 Java 类

机制图:


加载

  • 通过类加载器,根据类的名字查找相对应的字节码文件,把类的字节码数据(.class文件)加载到 JVM 中并转化为其内部的数据结构

验证

  • 验证阶段 JVM 检查字节码的格式、语义、安全性等方面的问题,以确保被加载的字节码符合 JVM 规范的过程

准备

  • 准备阶段 JVM 为类的静态变量(static修饰的变量)分配内存空间,并根据其类型设置如 0 、false、null 这样的默认初始值


解析

  • 解析阶段是将常量池中的 符号引用(类、方法、字段等符号) 替换为 直接引用(指向实际内存地址的指针) 的过程,也就是初始化常量的过程

初始化

  • 初始化阶段是执行类的初始化代码的过程,JVM 会按照代码顺序执行类的静态初始化块和静态变量的赋值操作

类被加载的几种情况(懒汉模式 ---> 只要被用到才会被加载)

  • 构造类的实例
  • 调用这个类的静态方法、使用这个类的静态属性
  • 加载子类,便会加载其父类
  • 该类一旦被加载过,后续再使用便不会重复加载

双亲委派模型

  • 属于 Java 类加载机制中的一种设计模式,描述的是加载阶段,寻找 .class 文件的基本过程
  • 默认提供了三个类加载器
Bootdtrsp Class LoaderExtension Class LoaderApplication Class Loader
加载标准库中的类加载 JVM 拓展库中的类加载用户提供的第三方库、用户项目代码 中的类
  • 上述三个类加载器存在父子关系 ,子 类加载器上有一个 parent 属性指向其父 类加载器

具体类加载过程:

  • 当一个类加载器收到加载类的请求时,它首先检查是否已经加载过这个类。如果已经加载过,则直接返回该类的 Class 对象

  • 如果类没有被加载过,那么该类加载器会将加载任务委派给父加载器去完成

  • 父加载器会按照相同的规则进行加载,即首先检查是否已经加载过该类,如果加载过则返回 Class对象,否则继续委派给它的父加载器

  • 这个过程一直往上委派,直到达到顶层的启动类加载器(Bootdtrsp Class Loader)。启动类加载器是 JVM 的一部分,它负责加载 Java 的标准库

  • 如果顶层的启动类加载器无法加载类,那么其子加载器会尝试自己加载类,它会通过自己的类路径搜索字节码文件,并将字节码转换为 Class 对象

例图:(加载 java.lang 类)

  • 这个加载顺序的主要目的是为了让 Bootdtrsp Class Loader 启动类能够先加载,Application Class Loader 启动类后加载。因为这样可以避免用户创建一些奇怪的类,引起不必要的 bug(用户自己写的类与标准库中的类重名)

双亲委派模型的优点:

  • 避免重复加载:每个类加载器都会缓存已加载的类,避免了同一个类被多次加载的情况

  • 安全性:通过双亲委派模型,核心类库由启动类加载器加载,这样可以保证核心类库的安全性,防止恶意代码替换核心类

  • 一致性:相同的类在不同的类加载器中只会存在一个实例,保证了类的一致性

  • 可扩展性:开发者可以通过自定义类加载器并继承现有的加载器,实现特定的类加载行为,从而实现动态的类加载和扩展

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

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

相关文章

SSM(Spring-Mybatis-SpringMVC)

文章目录 1. 介绍1.1 概念介绍 2 SSM整合框架3. SSM功能模块开发4 测试4.1 业务层接口测试4.2 表现层接口测试 5.优化 -表现层数据封装6.异常处理 1. 介绍 1.1 概念介绍 SSM项目是指基于SpringSpringMVCMyBatis框架搭建的Java Web项目。 Spring是负责管理和组织项目的IOC容器和…

二、C#—第一个c#程序(2)

🌻🌻 目录 一、编写第一个C#程序1.1 使用Visual Studio创建c#程序的步骤1.2 编写第一个程序“Hello Word”1.3 c#程序的基本结构1.3.1 c#中的命名空间1.3.2 c#中的类1.3.3 c#中的程序启动器——Main方法1.3.4 c#中的标识符1.3.5 c#中的关键字1.3.6 c#中的…

Vavido IP核Independent Clocks Block RAM FIFO简述

文章目录 1 FIFO(先入先出)1.1 概念1.2 应用场景1.3 FIFO信号1.4 FIFO读写时序1.4.1 FIFO读时序1.4.2 FIFO写时序 参考 1 FIFO(先入先出) 1.1 概念 FIFO(First in First out)即先入先出队列,是…

个性化定制界面还是极简版原装界面?我的选择是……

个性化定制界面和极简版原装界面,哪一个你用起来更加顺手呢,相比之下你更喜欢哪一个?来聊一聊原因吧! 一、我的观点和选择 个性化定制界面和极简版原装界面,二者各有优缺点。 (一)极简版原装…

windows vmware17虚拟机导出、导入

我采用的是vmware17版本的虚拟机软件 直接拷贝VM虚拟机文件 导出 查看虚拟机所在路径 复制整个文件夹,可以先压缩介绍文件大小,拷贝到需要还原该虚拟机的电脑上 导入 在目的电脑上需要安装vnware17版本的虚拟机软件 直接打开vmware17, 选…

Mysql--对varchar字段用int数值来查询的问题

在工作中遇到的一个问题。就是mysql的一个表中的一个字段是varchar类型的,这个字段用来存储身份证,身份证正好是18位的。但是在根据身份证号来查询用户的时候,忘了给这个查询条件的身份证号加上’"",然后就产生了问题。…

Pinia能否替代 Vuex 的更强大状态管理工具

前序 Pinia 是 Vue.js 团队成员专门为 Vue 开发的一个全新的状态管理库,也相当于vuex5,下面关于vuex5的提案是不是觉得很像 Vuex5 的提案 Pinia和Vuex的函数 Vuex: State、Getters、Mutations(同步)、Actions(异步) Pinia: St…

【C++进阶】模板进阶

👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:C航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&#x1…

SpringBoot项目集成Druid

文章目录 一、前言二、Druid相关内容1、Druid简介1.1数据库连接池 2、项目集成Druid2.1、环境准备2.2、依赖准备2.3、编写配置文件2.4、测试访问 3、功能介绍3.1、查看数据源3.2、SQL监控3.3、URI监控 三、总结提升 一、前言 本文将介绍Druid的相关内容以及项目如何集成Druid&…

每日一题(复制带随机指针的链表)

每日一题(复制带随机指针的链表) 138. 复制带随机指针的链表 - 力扣(LeetCode) 思路: 由于每个链表还包含了一个random节点指向了链表中的随机节点,所以并不能直接照搬复制原链表。首先想到的暴力思路是复…

Self-Attention Transformer完全指南:像Transformer的创作者一样思考

本文从RNN到self-attention,再到Transformer来讲清楚整个算法。 近半年来有大量同学来找我问Transformer的一些细节问题,例如Transformer与传统seq2seq RNN的区别、self-attention层的深入理解、masked self-attention的运作机制;以及各种Tr…

2018ECCV Can 3D Pose be Learned from2D Projections Alone?

摘要 在计算机视觉中,从单个图像的三维姿态估计是一个具有挑战性的任务。我们提出了一种弱监督的方法来估计3D姿态点,仅给出2D姿态地标。我们的方法不需要2D和3D点之间的对应关系来建立明确的3D先验。我们利用一个对抗性的框架,强加在3D结构…

vue通过draggable实现拖拽功能

1. 官方文档 2. 安装 yarn add vuedraggable npm i -S vuedraggable <script src"//cdnjs.cloudflare.com/ajax/libs/Vue.Draggable/2.20.0/vuedraggable.umd.min.js"></script> 3. 其他组件&#xff1a; sortablejs.js拖拽 非官网文档 npm install …

Java 集合框架3

一、集合框架分类 二、 关于Map接口的常用类 1.HashMap HashMap类是Map接口的子类&#xff0c;是处理无序键值对集合的 HashMap特征1.允许有null键和null值2.数据保存是无序的3.重复的键被算作一个数据 i.HashMap构造方法 //HashMap() 构造一个初始存储空间为16&#xff0c;负…

zemax混合式非序列模拟

基础设置&#xff1a; 3D视图效果&#xff1a; 接下来用非序列模式设计一个多焦透镜 平行光束经过多焦透镜时&#xff0c;会汇聚在不同焦距处 非序列模式的编辑器如图&#xff1a; 注意不要点击左侧的非序列模式&#xff0c;那个时纯粹的非序列&#xff0c;会清除序列模式的数…

Revit SDK 介绍:AutoStamp 自动水印 AutoUpdate 自动更新 CancelSave

前言 这三个例子都是通过注册事件来完成相应的工作&#xff0c;内容比较简单。 内容 事件参考博客&#xff1a;Revit API&#xff1a;Events 事件总览 AutoStamp 自动水印 使用到的事件&#xff1a; application.ControlledApplication.ViewPrinting application.Controll…

时序预测 | MATLAB实现EEMD-SSA-LSTM、EEMD-LSTM、SSA-LSTM、LSTM时间序列预测对比

时序预测 | MATLAB实现EEMD-SSA-LSTM、EEMD-LSTM、SSA-LSTM、LSTM时间序列预测对比 目录 时序预测 | MATLAB实现EEMD-SSA-LSTM、EEMD-LSTM、SSA-LSTM、LSTM时间序列预测对比预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 时序预测 | MATLAB实现EEMD-SSA-LSTM、E…

第一章辩证唯物论,考点七思维导图

逻辑框架 考点七思维导图&#xff1a;

【【萌新的STM32学习-27--USART异步通信配置步骤】】

萌新的STM32学习-27–USART异步通信配置步骤 USART/UART 异步通信配置步骤 1.配置串口工作参数 HAL_UART_Init() 我们会在此处调用MSP中的回调函数 2.串口底层初始化 用户定义HAL_UART_MspInit() 配置GPIO NVIC CLOCK 等 3.开启串口异步接收中断 HAL_UART_Receive_IT() 4.…

基于简单的信息变换实现自然语言模型

题目:基于简单的信息变换实现自然语言模型 摘要:在自然语言处理中,自然语言模型是至关重要的。本论文提出了一种基于简单的信息变换实现自然语言模型的方法。该方法将输入信息进行一系列的信息变换,如分割、属性、等效替换、增加删除等变换,与原始信息进行比较,得知信息是…