JVM内存区域划分,类的加载过程 以及 双亲委派模型总结

news2024/11/23 23:52:36

目录

JVM内存区域划分

Java类的加载过程

双亲委派模型


JVM内存区域划分

JVM中的内存区域共划分为五大部分,分别为虚拟机栈、堆、程序计数器、本地方法栈和方法区,如下边这张图所示:

 

 其中,每个内存区域主要存放的数据及功能如下:

  • 虚拟机栈:Java虚拟机栈描述了方法执行的内存模型,每个方法在执行时都会在栈上开辟一个栈帧用于存储局部变量,方法返回地址等。
  • 堆:我们在程序中创建的所有对象壹基金其中的成员变量都保存在堆中,堆内存是被线程所共享的。
  • 程序计数器:保存了下一条指令的执行地址
  • 方法区:方法区中包含了被虚拟机加载的类信息,常量和静态变量以及被编译器编译后的代码等数据,运行时常量池也包含在其中。
  • 本地方法栈:与虚拟机栈类似,只不过本地方法栈是给本地方法使用的。

上述的五大区域,除了堆和方法区之外,其他的区域都是线程私有的。

Java类的加载过程

Java类的加载过程共分为三大步:加载(loading)连接(linking)以及初始化(intialization)。其中连接(linking)阶段又分为验证(verification)准备(preparation)以及解析(resolution)三个小阶段。这个过程如下面这张图所示:

 类加载各个阶段的工作

  1. Loading加载阶段
    通过各种途径将类类的二进制字节码文件读入内存,并创建一个Class类对象
  2. Linking连接阶段
    1. Verification验证阶段
      验证字节码文件中的字节流信息是否符合特定JVM的规范,例如,文件格式验证以及符号引用验证等。如果项目较大,需要加载的类很多,可以在该阶段通过 -Xverify:none;参数关闭大部分类的加载验证阶段来缩短虚拟机类加载的时间达到优化效果
    2. Preparation准备阶段
      正式为类中定义的静态变量分配内存并设置初始值,静态变量使用的内存将在方法区中进行分配
    3. Resolution解析阶段
      JVM将常量池中的符号引用替换为直接引用
  3. Intialization初始化阶段
    编译器手机类中所有的静态代码块以及静态变量的值并执行静态代码块中的代码以及完成静态变量的赋值操作,完成类对象的构建

双亲委派模型

什么是双亲委派模型?

      它是处于类加载过程中loading阶段的一个环节。说的是如果一个类加载器接收到了类加载的请求,尝试加载类的过程。

      而为了应对不同的类加载场景,Java中已经定义好的不同的类加载器,并且每一个类加载器有自己负责的一片加载区域。

      当类加载请求发出后,首先会被最底层的类加载器接收到,并依次将这个请求传递给最顶层的类加载器进行加载,当顶层加载器无法在自己的加载区域中找到这个类时,就会依次反馈给底层类加载器进行加载。

      上述类加载器的工作过程就称为双亲委派模型,如下图所示。

关于Java中的类加载器

Java中已经定义好了以下的三个类加载器,它们各自负责的加载区域如下:

BootstrapClassLoader——负责加载JDK标椎库中的类信息

ExtensionClassLoader——负责加载JDK扩展类,像ClassPath执行的所有jar或者目录

ApplicationClassLoader——负责加载程序猿指定的目录中的类信息

以标准库类java.lang.String为例,我们来梳理下双亲委派模型下标椎类的加载过程:

  • 首先,ApplicationClassLoader接收到该类的加载请求,它会先检查下自己的父 加载器是否已经加载过了。如果没有,就将加载请求转发给父 加载器ExtensionClassLoader
  • ExtensionClassLoader也会检查下自己的父加载器BootstrapClassLoader是否已经加载过了,如果没有,就继续向上转发类加载请求给到BootstrapLoader
  • BootstrapClassLoader在接收到请求后从自己的加载区域(即JDK标准目录中)根据类的全限定名称查找该类,找到了,于是进行加载,完成该类的loading阶段的类加载过程

以自定义类java.shuai.Test为例,我们再来梳理下双亲委培模型下自定义类的加载过程:

  1. 首先,前两步与上述标椎类的加载过程一致
  2. 接着,BootstrapClassLoader根据该类的全限定名称从自己的加载区域中没有找到,于是反馈给下一层类 加载器ExtensionClassLoader进行加载
  3. 同理,ExtensionClassLoader在自己的加载区域中也没有找到,于是接着向下反馈给ApplicationClassLoader加载器
  4. ApplicationClassLoader从自己的加载区域(即程序猿的自定义类目录中)根据该类的全限定名称进行搜索并找到了,于是完成了该类的加载。

如果在上述过程中,父 加载器向下反馈到最底层类加载曾仍然没有找到这个类,就会抛出ClassNotFounfException异常。

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

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

相关文章

Visual Studio C# WinForm开发入门(4):概述

目录 一.Winform入门1.WinForm项目结构2.窗口设计与控件布局3.窗口事件4.时间显示器小练习 二.WinForm布局开发1.手动布局解决自适应问题2.WinForm布局属性3.WinForm布局器 三.WinForm常用控件1.界面展示2.实体类 Student(封装信息)3.逻辑事件代码Form.cs 四.图片框与项目资源1…

大数据电商数仓相关脚本

文章目录 前言一、群起集群1. sc 脚本2. cluster 脚本3. myhadoop 脚本4. zk.sh 脚本5. kf.sh 脚本6. f1.sh 脚本7. f2.sh 脚本 二、简便使用脚本1. xsync 脚本2. jpsall 脚本3. xcall.sh 脚本4. lg.sh 脚本 三、数据传输相关脚本1. mysql_to_hdfs.sh 脚本2. hdfs_to_ods_db.sh…

《JavaEE初阶》HTTP协议和HTTPS

《JavaEE初阶》HTTP协议和HTTPS 文章目录 《JavaEE初阶》HTTP协议和HTTPSHTTP协议是应用层协议:使用Fiddler抓取HTTP请求和响应:Fiddler的下载和基本使用:Fiddler的中间代理人身份:其他抓包工具: 先简单认识HTTP请求与HTTP响应:HTTP请求:HTTP响应: HTTP请求详解:首行&#xff1…

分享10个精美可视化模板,解决95%的大屏需求!

前段时间和朋友一起喝茶,我吐槽着excel表格做报表的繁琐,他惊讶的问我竟然不知道大屏模板这种东西,说是直接套用数据就可以,我震惊的同时吃下了这个安利。 回来之后,我好好研究了一番这个叫可视化大屏的“新鲜玩意儿”…

模块化编程原理示意图--CommonJS 模块编程--ES6 模块编程思路分析/图解--三种导出形式--全部代码示例

目录 模块化编程 基本介绍 模块化编程原理示意图 模块化编程分类 CommonJS 模块编程 介绍 应用实例 1. 需求说明 2. 思路分析/图解 3. 代码实现 function.js use.html use.js ES6 模块编程 介绍 需求说明 思路分析/图解 代码实现 common.js use_common.js …

MySQL入门到精通——进阶篇(基础篇——进阶篇——运维篇)本文以MySQL8.0版本以上为例

文章目录 前言MySQL——进阶篇一、存储引擎1.存储引擎-MySQL体系结构2.存储引擎-简介3.存储引擎-InnoDB介绍4.存储引擎-MyISAM和Memory5.存储引擎-选择 二、索引1.索引-概述2.索引-结构2.1.索引-结构-介绍2.2.索引-结构-Btree2.3.索引-结构-Btree2.4.索引-结构-hash 3.索引-分类…

【Java-02】深入理解关键字和代码块

1 关键字 2 代码块 1 Java中的关键字 1.1 static关键字 static关键字 : 静态的意思 , 可以修饰变量 , 也可以修饰方法 , 被static修饰的成员 , 我们叫做静态成员 static特点 : 静态成员被所类的所有对象共享随着类的加载而加载 , 优先于对象存在可以通过对象调用 , 也可以通…

学习系统编程No.23【信号实战】

引言: 北京时间:2023/4/23,最近学习状态不怎么好,总是犯困,没精力的感觉,可能是病没有好彻底的原因,也可能是我内心因为生病而认为摆烂理所应当,反正最后导致摆烂,课现在…

JetpackCompose从入门到实战学习笔记14——Coli的简单使用

JetpackCompose从入门到实战学习笔记14——Coli的简单使用 1.简介: Coil 是一个 Android官方出的配合Jetpack的图片加载库,通过 Kotlin 协程的方式加载图片。 优点如下: 更快: Coil 在性能上有很多优化,包括内存缓存和磁盘缓存…

体验了多款国产类ChatGPT产品后,我选择了道合顺的【ChatIC】

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言A…

springboot实用配置

springboot实用配置 (一)打包与运行(二)配置高级1.临时属性设置2.配置文件分类3.自定义配置文件 (三)多环境开发(四)日志1.日志基础2.日志输出格式控制3.日志文件 (一&am…

什么是OpenVino?以及如何使用OpenVino运行yolo

目录 Openvino简介 如何使用它? 构建源代码 Openvino IR模型 第一个Openvino示例 C语言示例 C示例 使用OpenVino跑Yolo模型 Openvino简介 Openvino是由Intel开发的专门用于优化和部署人工智能推理的半开源的工具包,主要用于对深度推理做优化。 …

开源,点云处理及三维重建软件(Point Cloud Viewer, PCV)的设计与实现

GitHub地址:point-cloud-viewer GitCode地址:point-cloud-viewer 文章目录 使用教程以及相关工具库Step 1 搭建环境Step 2 使用Cmake构建工程Step3 使用VS 编写code并编译执行 点云处理及三维重建软件(PCV)的设计与实现一, 软件总体设计1.1 软…

C++ LinuxWebServer 2万7千字的面经长文(下)

⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! Linux Web Server项目虽然是现在C++求职者的人手一个的项目,但是想要吃透这个项目,还是需要一定的基础的,以项目为导向,进行基础的学习。 涵盖了计算机网络(网络编程…

springboot网上商城项目(一)

springboot网上商城项目(一) (一)项目分析1.项目分析2.开发顺序3.前端资源测试 (二)用户注册1.创建数据库2.实体类编写3.注册(持久层)4.注册(业务层)5.注册&a…

类ChatGPT的部署与微调(下):从ChatGLM-6b到ChatDoctor、可商用

前言 随着『GPT4多模态/Microsoft 365 Copilot/Github Copilot X/ChatGPT插件』的推出,绝大部分公司的技术 产品 服务,以及绝大部分人的工作都将被革新一遍 类似iPhone的诞生 大家面向iOS编程 有了App Store现在有了ChatGPT插件/GPT应用商店&#xff…

国产CMS61850那些事-服务端

前面两篇文章国产CMS61850那些事-总述_LinuxZQ的博客-CSDN博客,cms61850那些事-实现_LinuxZQ的博客-CSDN博客分别对国产61850做了一些简单介绍和相关实现。本文接着给大家提供一款服务端demo,可以用来进行抓包等相关学习。 与之前分享的mms 61850一样&am…

如此这般,好吗?

让我们回顾一下 Linux 社区最新的愿景——推动去中心化的应用来解决发行版的碎片化。继上周的文章:“Snap、Flatpak 这种通吃所有发行版的打包方式真的有用吗?” 之后,一系列新观点浮出水面,其中可能包含关于这样应用是否有用的重…

Vmware安装Ubuntu出现 unable to find a medium containing a live file system

一、前言 由于未知的原因,使用Vmware安装Ubuntu的时候,总是遇到奇怪的问题。(忘记截图了…) 大致是: unable to find a medium containing a live file system找了几个帖子,参考1、参考2,但都…

GPT模型成功的背后用到了哪些以数据为中心的人工智能(Data-centric AI)技术?

人工智能(Artificial Intelligence, AI)最近取得了巨大的进展,特别是大语言模型(Large Language Models, LLMs),比如最近火爆全网的ChatGPT和GPT-4。GPT模型在各项自然语言处理任务上有着惊人的效果。至于具…