JVM的相关知识

news2024/10/5 16:19:28

目录

JVM内存划分

类加载过程

类加载中的“双亲委派模型”


JVM内存划分

JVM也就是java进程。这个进程一旦跑起来之后,就会从操作系统里,申请一大块内存空间。JVM接下来就要进一步的对这个大的空间进行划分。划分成不同区域,从而每个区域都有不同的功能作用。

具体如何划分的:

1、堆区    整个内存区域中,最大的区域。放的就是代码中new 出来的对象类中的成员变量存储在堆上。

2、栈区   分为JVM虚拟机栈本地方法栈,都是保存了方法的调用关系。JVM虚拟机栈中存放的是java代码的调用关系。本地方法栈中存放的是针对JVM内部C++代码的调用关系。局部变量存储在栈区。

3、元数据区   (以前叫“方法区”,从java8改成了元数据区)放的是“类对象”。代码中写的每个类,在jvm上运行的时候,都会有对应的类对象。还放了方法相关的信息,类有一些方法,每个方法都代表了一系列的“指令集合”(JVM字节码指令)。

常量池:放的类中定义的常量。

4、程序计数器    是内存区域中最小的区域,只需要保存当前要执行的下一条指令(JVM字节码)的地址(这个地址就是元数据区里面的一个地址 )。

基本原则

一个对象在哪个区域,取决于对应变量的形态。

1)局部变量  栈上

2)成员变量  堆上

3)静态成员变量  方法区/元数据区

上述四个区域中,堆和元数据区,是整个进程只有一份。栈和程序计数器,是每个线程都有一份的。多个线程共享同一份数据,每个线程的局部变量,则不是共享的,每个线程都是有自己一份的。

类加载过程

一个java进程要跑起来,就需要把.java先变成.class文件(硬盘),加载到内存中,得到“类对象”。

类加载的几个环节

1)加载:在硬盘上找到对应的.class文件,读取文件内容。

2)验证:检查.class里的内容,是否符合要求。

3)准备:给类对象,分配内存空间。(类加载最终要得到的就是类对象)会先把这个空间里的数据先全都填充成0。(此时,如果这个类有静态成员,值就是0)

4)解析:针对字符串常量来初始化。把.class文件中的常量的内容取出来,放到“元数据区”。

5)初始化:针对类对象初始化。(不是针对对象初始化,和构造方法无关)会给静态成员初始化。

此时类对象就加载完成了,后续代码就可以使用这个类对象,创建实例,或者使用里面的静态成员了。

类加载中的“双亲委派模型”

该模型出现在“加载”环节,根据代码中的“全限定类名”(包名+类名)找到对应的.class文件。

双亲委派模型描述了JVM加载.class文件过程中,找文件的过程。

  “类加载器”:在JVM中包含的一个特定的模块/类。这个类负责完成后续的类加载工作。

JVM中内置了3个类加载器,负责加载不同的类。

1)BootstrapClassLoader

负责加载标准库的类。

2) ExtentionClassLoader

负责加载JVM扩展库里面的类。

3) ApplicationClassLoader

负责加载第三方库的类和你自己写的代码的类。

从上至下三个类加载器依次为父子关系,BootstrapClassLoader为ExtentionClassLoader的父亲,此处的“父子关系”不是通过类的继承表示的(不是父类子类)。而是通过类加载器中存在一个“parent”这样的字段,指向自己的父亲。

双亲委派模型的工作过程

例如,给定了一个类的全限定类名,比如java111.Test

此时加载过程如下:

1、工作从ApplicationClassLoader开始,ApplicationClassLoader并不会立即开始搜索第三方库的相关目录,而是把任务交给自己的父亲来进行处理。

2、工作就到了ExtentionClassLoader,也不会立即搜索负责的拓展库的目录,也是把任务交给自己的父亲来处理。

3、工作就到了BootstrapClassLoader,也想交给自己的父亲来处理,但是它的parent指向null,只能自己处理,BootstrapClassLoader尝试在标准库的路径中搜索上述类。如果这个类,在标准库中找到了,于是搜索过程就完成了,类加载器负责打开文件,读取文件等后续操作就行了。

如果没找到,任务还是要继续还给儿子来处理。

4、工作回到了ExtentionClassLoader,此时就要搜索扩展库对应的目录了。如果找到了,就由当前的类加载器负责打开文件,读取文件等后续操作。如果没找到,任务还是要继续交给儿子来处理。

5、工作又回到了ApplicationClassLoader,此时要搜索第三方库/用户项目代码的目录了。如果找到了,也是由当前的类加载器负责处理。如果没找到,任务还是要继续还给儿子来处理。此时,没有儿子了,还没找到,就会最终抛出一个ClassNotFoundException

上述过程,主要为了应对这个场景:

比如你自己代码里写了一个类,类的名字和标准库/拓展库冲突了,JVM会确保加载的类是标准库的类(就不加载你自己写的类了)。

是否可以打破双亲委派模型?比如自己写个类加载器,是否必须按照上述的流程完成类的查找过程呢?

可以打破。但实际开发中一般不会自己实现。

以上,关于JVM,希望对你有所帮助。

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

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

相关文章

惯性测量单元M-G370系列广泛用于工业系统各个领域

爱普生现已推出型号为M-G370系列的高稳定性、高精度及极小尺寸封装的惯性测量单元(IMU),可广泛应用于工业系统的各个领域。 为了节省PCB的面积和产品空间,M-G370系列性测量单元设计精巧,且具有6个自由度:三轴角速率和三轴线性加速度&…

如何使用git上传linux下的项目!---附带每一步截图

在实际项目中,我们需要把自己的模块递给GitHub,需要别人的模块的时候拉下来,那么我们怎么把自己的项目递给GitHub呢?下面做一个总结: 登录GitHub 创建一个仓库 填写相关信息 项目名称是必填的,项目描述可以…

RK3568平台(camera篇)V4L2查询获取设置设备

一.查询设备能力VIDIOC_QUERYCAP struct v4l2_capability cap; ioctl(fd, VIDIOC_QUERYCAP, &cap) struct v4l2_capability 结构体描述了视频采集设备的 driver 信息。 struct v4l2_capability { __u8 driver[16]; // 驱动名字 __u8 card[32]; // 设备名字 __u8 bus_inf…

CSS学习笔记:Less

什么是Less? Less是一个CSS预处理器, Less文件后缀是.less 扩充了CSS 语言,使CSS具备一定的逻辑性、计算能力 可以通俗地理解:Less是一种更好用的CSS 注释 运算 嵌套 Less嵌套的作用:快速生成后代选择器 变量 问…

【Spring MVC】_SpringMVC项目返回数据

目录 1. 注解使用示例 1.1 使用Controller注解 1.2 使用RestController注解 1.3 使用Controller与ResponseBody注解 2. 关于ResponseBody注解 前文已经介绍过使用Controller注解向前端返回一个HTML页面,接下来将介绍向前端返回数据。 关于Controller和RestCon…

Rohm公司参展欧洲PCI盛会

​德国历史悠久的文化名城纽伦堡,即将迎来一场科技盛宴——欧洲PCI展览会。在这个为期三天的盛会中(6月11日至13日),Rohm公司将以璀璨之姿,特别聚焦宽带隙(WBG)设备的璀璨光芒。 此次&#xff0…

正则表达式介绍及一些实例(js语法)

一、正则表达式 正则表达式,全称“Regular Expression”,在代码中常简写为regex、regexp或RE。正则表达式,就是用某种模式去匹配一类字符串的公式。 1. 显式定义(构造函数) let 变量名 new RegExp("正则表达式…

CVPR2024《RMT: Retentive Networks Meet Vision Transformers》论文阅读笔记

论文链接:https://arxiv.org/pdf/2309.11523 代码链接:https://github.com/qhfan/RMT 引言 ViT近年来在计算机视觉领域受到了越来越多的关注。然而,作为ViT的核心模块--自注意力缺乏空间先验知识。此外,自注意力的二次计算复杂度…

oracle 12c GI卸载流程

集群节点停止服务 [crsctl stop crs -f grid运行deinstall [rootprimary1 bin]# su - grid [gridprimary1 ~]$ cd $ORACLE_HOME/deinstall [gridprimary1 deinstall]$ ls bootstrap_files.lst bootstrap.pl deinstall deinstall.pl deinstall.xml jlib readme.txt …

电机控制系列模块解析(25)—— 过压抑制与欠压抑制

一、概念解析 变频器作为一种重要的电机驱动装置,其内置的保护功能对于确保系统安全、稳定运行至关重要。以下是关于变频器过压抑制、欠压抑制(晃电抑制)、发电功率限制、电动功率限制等保护功能的详细说明: 过压抑制 过压抑制是…

基于python flask的疾病数据采集与可视化大屏,实现关联规则算法的治疗方法分析

背景 基于Python Flask的疾病数据采集与可视化大屏,旨在实现对疾病数据的采集、分析和可视化展示,为医疗领域提供决策支持和治疗方法分析。其中,关联规则算法被应用于治疗方法分析,旨在发现不同治疗方式之间的关联性和规律性&…

【RuoYi】使用代码生成器完成CRUD操作

一、前言 前面,介绍了如何下载和启动我们的RuoYi框架。为了让小伙伴们认识到ruoyi的强大,那么这篇博客就介绍一下如何使用ruoyi的代码生成器,自动生成前端页面以及后端的对应数据库表的CRUD操作!!!真的很强…

填补领域空白!TerDiT:首次探索大规模DiT模型量化问题(MMLab出品)

论文链接:https://arxiv.org/pdf/2405.14854 项目链接:https://github.com/Lucky-Lance/TerDiT 最近在大规模预训练的文本到图像扩散模型方面的发展显著提高了高保真图像的生成能力,特别是基于transformer架构的扩散模型(DiTs&a…

linux中使用gdb调试c++的dump文件

1 查看系统是否开启dump生成 0表示没开启 ulimit -c 但是这个只是针对当前这个连接,如果想要永久修改可以修改配置文件:vim /etc/profile,然后添加上面的命令ulimit - c unlimited.然后执行source /etc/profile或者重启使刚刚的配置可以…

selenium学习笔记

什么是selenium 比较官方的解释 Selenium是一个自动化测试工具,用于在Web应用程序中模拟用户操作。它提供了一组API,可以通过编程方式控制浏览器,并模拟用户的交互行为,例如点击、输入文本和导航等。Selenium支持多种编程语言&a…

让AI学相机对焦: Learning to AutoFocus

前言 分析来自谷歌发表在 CVPR 2020 上的论文 Learning to Autofocus :https://arxiv.org/pdf/2004.12260 目前网上对这篇论文的分析较少,有的分析并没有指出关键点,如:论文解读: Learning to AutoFocus-CSDN博客&am…

LeetCode115:不同的子序列

题目描述 给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数,结果需要对 109 7 取模。 代码 /*dp[i][j]:以i为结尾的s中有以j为尾的t的个数递推公式:当s[i - 1] 与 t[j - 1]相等时,dp[i][j]可以有两…

Trie字符串统计-java

Trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。 目录 前言☀ 一、Trie字符串统计☀ 二、算法思路☀ 1.Trie树定义🌙 2.变量解释🌙 3.插入操作🌙 4.Trie树查找操…

以果决其行,只为文化的传承

从他们每一个人的身上,我们看到传神的东西,就是他们都能用结果,去指引自己前进的方向,这正是我要解读倪海厦老师的原因,看倪海厦2012年已经去世,到现在已经十几年时间了,但是我们看现在自学中医…

【设计模式深度剖析】【6】【结构型】【外观模式】| 以电脑开关按钮为例,并结合微服务架构的API网关加深理解

👈️上一篇:桥接模式 设计模式-专栏👈️ 目 录 外观模式(Facade Pattern)定义英文原文直译如何理解呢?字面理解代码实现中的理解生活案例:操作多功能料理机典型案例分析:API网关与外观模式 外…