JVM学习(五)

news2024/11/18 11:18:43

1.1 JVM 类加载机制

JVM 类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这
五个过程。

1.1.1  加载
        加载是类加载过程中的一个阶段, 这个阶段会在内存中生成一个代表这个类的 java.lang.Class 对 象 作为方法区这个类的各种数据的入口 。注意这里不一定非得要从一个 Class 文件获取,这里既 可以从 ZIP 包中读取(比如从 jar 包和 war 包中读取),也可以在运行时计算生成(动态代理), 也可以由其它文件生成(比如将 JSP 文件转换成对应的 Class 类)。
1.1.2  验证
        这一阶段的主要目的是为了 确保 Class 文件的字节流中包含的信息是否符合当前虚拟机的要求 ,并 且不会危害虚拟机自身的安全。
1.1.3. 准备
        准备阶段是正式为类变量分配内存并设置类变量的初始值阶段,即 在方法区中分配这些变量所使 用的内存空间 。注意这里所说的初始值概念,比如一个类变量定义为:
        public static int v = 8080;
        实际上变量 v 在准备阶段过后的初始值为 0 而不是 8080, 将 v 赋值为 8080 的 put static 指令是 程序被编译后, 存放于类构造器<client>方法之中
        但是注意如果声明为:
        public static final int v = 8080;
        在编译阶段会为 v 生成 ConstantValue 属性,在准 备阶段虚拟机会根据 ConstantValue 属性将 v 赋值为 8080
1.1.4. 解析
        解析阶段是指 虚拟机将常量池中的符号引用替换为直接引用的过程 。符号引用就是 class 文件中 的: 
        1. CONSTANT_Class_info
        2. CONSTANT_Field_info
        3. CONSTANT_Method_info
        等类型的常量。
1.1.5. 符号引用
         符号引用与虚拟机实现的布局无关, 引用的目标并不一定要已经加载到内存中 各种虚拟
机实现的内存布局可以各不相同 ,但是它们能接受的符号引用必须是一致的,因为符号引
用的字面量形式明确定义在 Java 虚拟机规范的 Class 文件格式中。
1.1.6. 直接引用
        直接引用可以 是指向目标的指针,相对偏移量或是一个能间接定位到目标的句柄 。如果有
了直接引用,那 引用的目标必定已经在内存中存在
1.1.7. 初始化
        初始化阶段是类加载最后一个阶段,前面的类加载阶段之后,除了在加载阶段可以自定义类加载 器以外,其它操作都由 JVM 主导。到了初始阶段,才开始真正执行类中定义的 Java 程序代码。
1.1.8. 类构造器<client>
       初始化阶段 是执行类构造器<client>方法的过程 。<client>方法是由编译器自动收集类中的类变
量的赋值操作和静态语句块中的语句合并而成的。虚拟机会保证子<client>方法执行之前,父类
的<client>方法已经执行完毕, 如果一个类中没有对静态变量赋值也没有静态语句块,那么编译
器可以不为这个类生成<client>()方法
        注意以下几种情况不会执行类初始化:
        1. 通过子类引用父类的静态字段,只会触发父类的初始化,而不会触发子类的初始化。
        2. 定义对象数组,不会触发该类的初始化。
        3. 常量在编译期间会存入调用类的常量池中,本质上并没有直接引用定义常量的类,不会触
发定义常量所在的类。
        4. 通过类名获取 Class 对象,不会触发类的初始化。
        5. 通过 Class.forName 加载指定类时,如果指定参数 initialize 为 false 时,也不会触发类初
始化,其实这个参数是告诉虚拟机,是否要对类进行初始化。
        6. 通过 ClassLoader 默认的 loadClass 方法,也不会触发初始化动作。
1.2. 类加载器
       虚拟机设计团队把加载动作放到 JVM 外部实现,以便让应用程序决定如何获取所需的类,JVM 提 供了 3 种类加载器:
1.2.1. 启动类加载器(Bootstrap ClassLoader)
        负责加载 JAVA_HOME\lib 目录中的,或通过-Xbootclasspath 参数指定路径中的,且被
虚拟机认可(按文件名识别,如 rt.jar)的类。
1.2.2. 扩展类加载器(Extension ClassLoader)
        负责加载 JAVA_HOME\lib\ext 目录中的,或通过 java.ext.dirs 系统变量指定路径中的类
库。
1.2.3. 应用程序类加载器(Application ClassLoader):
        负 责加载用户路径(classpath)上的类库
        JVM 通过双亲委派模型进行类的加载,当然我们也可以通过继承 java.lang.ClassLoader
实现自定义的类加载器。

 

1.3. 双亲委派
        当一个类收到了类加载请求,他首先不会尝试自己去加载这个类,而是把这个请求委派给父
类去完成 ,每一个层次类加载器都是如此,因此所有的加载请求都应该传送到启动类加载其中,
只有当 父类加载器反馈自己无法完成这个请求的时候 (在它的加载路径下没有找到所需加载的
Class), 子类加载器才会尝试自己去加载
        采用双亲委派的一个好处是比如加载位于 rt.jar 包中的类 java.lang.Object,不管是哪个加载
器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了 使用不同的类加载
器最终得到的都是同样一个 Object 对象。

1.4. OSGI 动态模型系统
        OSGi(Open Service Gateway Initiative),是面向 Java 的动态模型系统,是 Java 动态化模块化系 统的一系列规范。
1.4.1. 动态改变构造
        OSGi 服务平台提供在多种网络设备上无需重启的动态改变构造的功能。为了最小化耦合度和促使 这些耦合度可管理,OSGi 技术提供一种面向服务的架构,它能使这些组件动态地发现对方。
1.4.2. 模块化编程与热插拔
        OSGi 旨在为实现 Java 程序的模块化编程提供基础条件,基于 OSGi 的程序很可能可以 实现模块级 的热插拔功能 ,当程序升级更新时,可以只停用、重新安装然后启动程序的其中一部分,这对企 业级程序开发来说是非常具有诱惑力的特性。
        OSGi 描绘了一个很美好的模块化开发目标,而且定义了实现这个目标的所需要服务与架构,同时 也有成熟的框架进行实现支持。但并非所有的应用都适合采用 OSGi 作为基础架构,它在提供强大 功能同时,也引入了额外的复杂度,因为它不遵守了类加载的双亲委托模型。

 

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

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

相关文章

路径规划算法:基于教与学优化算法的路径规划算法- 附代码

路径规划算法&#xff1a;基于教与学优化优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于教与学优化优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能…

Springcloud1--->负载均衡Ribbon

目录 负载均衡算法负载均衡原理启动两个服务实例开启负载均衡更改Ribbon随机策略 什么是Ribbon&#xff1a; 负载均衡算法 负载均衡算法&#xff1a; 1.轮询法&#xff1a;   将请求按顺序轮流地分配到后端服务器上&#xff0c;它均衡地对待后端的每一台服务器&#xff0c;而…

【正点原子STM32连载】 第十三章 跑马灯实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第十三…

chatgpt赋能Python-python3_9_7怎么用

介绍Python3.9.7及其用途 Python是一种高级编程语言&#xff0c;已成为Web开发、数据科学、机器学习等领域中最广泛使用的语言之一。Python3.9.7是Python的最新版本&#xff0c;于2021年9月6日发布。它包括各种新的特性、改进和安全性实现&#xff0c;提高了Python应用程序的稳…

计算机图形学-GAMES101-13

Ray Tracing &#xff08;1&#xff09;为什么使用光线追踪 Ray Tracing 和 Rasterization 是两种不同的成像方式。Rasterization最大的问题&#xff1a;不利于表达全局效果。整体来说光栅化做阴影是比较困难的。Glossy reflection&#xff1a;一种不那么光滑的反射镜面。Ind…

在 Linux 上使用 yuzu 模拟 Nintendo Switch 试玩王国之泪

王国之泪5月12日发售&#xff0c;DLC 玩家已经造出各种脑洞大开的东西了&#xff0c;但是买的卡带迟迟没有收到&#xff0c;因此&#xff0c;打算使用 yuzu 模拟器先体验一下 yuzu 是一款开源的 Ninetendo Switch 模拟器&#xff0c;支持在 Linux 或者 Windows 平台运行&#…

GoLand 2023 Crack函数的支持

GoLand 2023 Crack函数的支持 增加了对“MIN_BY”和“MAX_BY”函数的支持。 更新了Prisma插件previewFeatures以包含jsonProtocol。 改进了与角度相关的符号的文档-添加了更多关于管道、特性和指令的文档。当您将鼠标悬停在符号上或调用显示文档完成时(F1/CtrlQ)&#xff0c;您…

linux工作目录切换命令文件查看及管理命令

1、查看用户工作目录 2、切换工作目录 这里使用cd命令即可&#xff0c;输入对应的路径就可切换。 如果要返回上一次所处的目录输入 cd - 如果要返回上层目录使用 cd … 返回用户家目录使用 cd ~ 3、查看目录中文件信息命令 使用ls命令可以查看目录中文件信息-a 参数可以…

Windows 和 Linux 环境下 ProtoBuf 的安装

文章目录 一、ProtoBuf 在 Windows 环境中的安装二、ProtoBuf 在 Linux 环境中的安装 ProtoBuf在GitHub上的下载地址 一、ProtoBuf 在 Windows 环境中的安装 首先选择自己要下载的版本&#xff0c;我选择的是v21.11&#xff1a; 点进去在最下面选择Windows的版本&#xff0…

New:dbForge Edge 2023 4in1 Enterprise Edition Crack

dbForge Edge 2023 4in1 Enterprise Edition 赋予自己开发和管理 SQL Server、MySQL、Oracle 和 PostgreSQL 数据库的广泛能力 dbForge Edge&#xff1a;您的终极多数据库解决方案 让我们来看看。您需要处理多个数据库管理系统。同时&#xff0c;您希望能够灵活有效地处理范围广…

jface

JFace 是建立在 SWT 之上的 UI 部件&#xff0c;它是 SWT 的扩展并能和SWT交互。 ApplicationWindow和Action org.eclipse.jface.window.ApplicationWindow; JFace为了简化窗口的设计特别设计了类&#xff0c;比如ApplicationWindow这一个类&#xff0c;它里面包含了六个默认…

5年测试12月被裁,准备3个月终上岸阿里25K,面试时差点被问哭···

我的个人背景非常简单&#xff0c;也可以说丝毫没有亮点。 学历普通&#xff0c;计算机专业二本毕业&#xff0c;毕业后出来就一直在一家小公司&#xff0c;岁月如梭细&#xff0c;算了下至今从事软件测试已经5年了&#xff0c;也点点点了五年&#xff0c;每天都是重复的工作&…

不用再找了,你要的国内好用的ChatGPT网站都在这里

&#x1f4a1; 大家好&#xff0c;我是可夫小子&#xff0c;关注AIGC、读书和自媒体。解锁更多ChatGPT、AI绘画玩法。加&#xff1a;keeepdance&#xff0c;备注&#xff1a;chatgpt&#xff0c;拉你进群。 目录 ChatGPT是什么 OpenAI与ChatGPT的发展历程 AI对话聊天 AI文档…

GWAS分析中的GO和KEGG富集分析

上一次&#xff0c;我们介绍如何根据显著性snp&#xff0c;使用bedtools根据上下游距离&#xff0c;根据gff文件注释基因。 这一次&#xff0c;介绍一下如何根据注释的基因&#xff0c;进行富集分析&#xff0c;主要是看一下GWAS定位的基因有没有某一个趋势&#xff0c;也算是…

Python泰裤辣丨520写一个自动换壁纸软件,将女友照骗放进去送给她

Python泰裤辣!520写一个自动换壁纸软件&#xff0c;将女友照骗放进去送给她! 准备工作1、环境2、使用的模块3、如何配置pycharm里面的python解释器?4、pycharm如何安装插件? 代码实战1、获取壁纸 自动更换壁纸程序最后 话说兄弟们&#xff0c;今天520你们都送给女朋友啥礼物了…

文件上传之,waf绕过(24)

上传参数名解析&#xff1a;明确哪些东西可以修改 content-disposition:一般可更改 表单的数据 name:表单参数值&#xff0c;不能更改 表单提交的值 filename&#xff1a;文件名&#xff0c;可以修改 上传的文件名 content-type&#xff1a;文件mime&#xff0c;…

算法学习(数组和字符串) 之数组简介

集合、列表和数组 1.集合&#xff1a; 集合一般被定义为由一个或多个确定的元素所构成的整体。通俗来讲&#xff0c;集合就是将一组事物组合在一起。你可以将商店里的所有物品当成一个集合。 特点&#xff1a; 集合里的元素没有顺序集合里的元素类型不一定相同 2.列表&…

【Python入门篇】——Python中循环语句(for循环的基础语法)

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; Python入门&#xff0c;本专栏主要内容为Python的基础语法&#xff0c;Python中的选择循环语句…

Foley Sound——DECASE项目——项目复现

文章目录 概述项目复现配置环境下载并配置文件运行代码第一阶段&#xff0c;训练提取DTFR特征的模型资料搜集 train_vqvae.py 第二阶段&#xff0c;使用训练好的模型提取声音的DTFR特征torch.cuda.OutOfMemoryError: CUDA out of memory. 第三阶段&#xff0c;基于特征训练合成…