JVM的相关知识

目录

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,希望对你有所帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux服务器安装与配置python环境 最新linux安装python 小白教程

目录 一、下载官网的安装包 二、安装流程 三、配置软连接(类似window系统的环境变量) 四、可能会出现的问题: 1.ssl连接问题,下图所示: 一、下载官网的安装包 1.官网安装包地址:https://www.python.org/…

安装node 、vscode

先安装node,再安装vscode! 目录 一、Node 1. 进入node 官网,选择版本,点击下载(4步完成下载)。 2. winR ,输入cmd 进入控制端,如下图 3. 输入node -v ,查看是否安装完成,若安装…

使用小猪APP分发打造高效的App封装工具

你是否曾经因为App封装和分发的复杂性而头疼不已?在这个移动应用迅速发展的时代,开发人员不仅需要专注于应用的功能和用户体验,还必须面对繁琐的封装和分发过程。幸运的是,小猪APP分发www.appzhu.cn正好为我们提供了一个简便而高效…

Leetcode3165. 不包含相邻元素的子序列的最大和(Go中的线段树分治包含多类数据使用maintain进行维护)

题目截图 题目分析 不能取相邻的,就是打家劫舍 然后更改某一个值就是单点更新 更新后,需要更新区间的值 需要注意的是,使用分治时需要考虑到一头一尾的问题,所以有4种情况(选or不选在两个位置) 这四种情况…

大数据——Spark

1.Spark MLlib概述 MLlib是Spark的机器学习(Machine Learning)库,旨在简化机器学习的工程实践工作,并方便扩展到更大规模。 MLlib由一些通用的学习算法和工具组成,包括分类、回归、聚类、协同过滤、降维等&#xff0…

如果不花钱,又担心钱存着贬值,怎么办?如果把大部分钱投入到赚钱的事上,特别是自己专业上,比如说我是十年的程序员,帮我分析投资?

如果你不想花钱,但又担心钱存着会贬值,有几个策略可以帮助你在不花费大量金钱的情况下保护你的资金价值: 高收益储蓄账户或货币市场账户: 选择一个高收益的储蓄账户或货币市场账户,这些账户通常比传统储蓄账户提供更高…

爬虫案例-亚马逊反爬分析-验证码突破(x-amz-captcha)

总体概览:核心主要是需要突破该网站的验证码,成功后会返回我们需要的参数后再去请求一个中间页(类似在后台注册一个session),最后需要注意一下 IP 是不能随意切换的 主要难点: 1、梳理整体反爬流程 2、验证…

手把手教你如何在 Sider (ChatGPT Sidebar) 中免费使用阿里云通义千问

最近国产大模型正在疯狂降价,推出了众多的免费策略,是时候该“白嫖”一手了。用过 Sider 的小伙伴应该很少有说不“妙”啊,用户体验也做得很棒。奈何它要开通使用全部的功能价格有可能不太能承受,且有些功能不一定用得上。但是免费…

Java+Spring+ IDEA+MySQL云HIS系统源码 云HIS适合哪些地区的医院?

JavaSpring IDEAMySQL云HIS系统源码云HIS适合哪些地区的医院? 云HIS适合哪些地区的医院? 云HIS(云医院信息系统)适合多种地区的医院,特别是那些希望实现医疗服务的标准化、信息化和规范化,同时降低IT运营成…

Clion远程调试

本文详细介绍了如何使用CLion进行远程调试,旨在帮助开发者解决在远程开发环境中进行代码调试的难题。文章首先概述了远程调试的概念和重要性,强调了其在提高开发效率和代码质量方面的作用。接着,详细阐述了在CLion中配置远程调试环境的步骤&a…

【html+css(大作业)】二级菜单导航栏

目录 实现效果 代码及其解释 html部分 CSS部分 hello&#xff0c;hello好久不见&#xff01; 今天我们来写二级导航栏&#xff0c;所谓二级导航栏&#xff0c;简单来说就是鼠标放上去就有菜单拉出&#xff1a; 实现效果 代码及其解释 html部分 <!DOCTYPE html> &l…

气膜建筑的运行保障:应对停电的解决方案—轻空间

气膜建筑作为一种现代化的建筑形式&#xff0c;以其独特的结构和多样的应用赢得了广泛关注。这种建筑依靠风机不断往内部吹气来维持其结构形态&#xff0c;那么如果遇到停电的情况&#xff0c;该如何确保其正常运行呢&#xff1f; 气膜建筑的供风系统 气膜建筑内部的气压维持依…

UI自动化测试最佳设计模式POM

当使用Selenium进行UI自动化测试时&#xff0c;Page Object Model&#xff08;POM&#xff09;是一种最佳实践的设计模式。POM的核心思想是通过将页面封装成对象&#xff0c;使得测试代码更加清晰、可维护和可重用。 POM的主要组成部分包括页面对象类、元素定位方式和操作方法…

【CCF-CSP】 202309-3 梯度求解

思路&#xff1a; 将表达式整理成只有目标求导变量的无括号加法表达式&#xff0c;其他变量均代入其值&#xff0c;然后利用最简单的求导公式&#xff0c;求出最终值。 样例1 x1 x1 x1 * x2 *转换成 x1*x1*x1x1*x2 若求导x1&#xff0c;则只留下x1&#xff0c;变为 x1*x1*x1…

6公里远距离视频传输,飞睿智能无线CV5200模组方案,设备稳定连接通信

随着科技的不断进步&#xff0c;物联网&#xff08;IoT&#xff09;和智能设备正逐渐渗透到我们生活的方方面面。在这一进程中&#xff0c;远距离无线通信成为推动行业发展的关键因素。 智能控制、远程无线传输是实现设备间的协作场景的关键&#xff0c;CV5200模组通过无线WiF…

大白话70个你必须知道的AI重要概念

本文按英文起首字母顺序&#xff0c;整理了70个常用的生成式AI领域常用概念&#xff0c;试图以大白话进行诠释&#xff0c;如果你不求甚解、但也求略解的话&#xff0c;欢迎收藏。第一部分从A到I&#xff0c;第二部分从L到P&#xff0c;第三部分从Q到Z。 A 1 Agents: 代理人。…

民国漫画杂志《时代漫画》第31期.PDF

时代漫画31.PDF: https://url03.ctfile.com/f/1779803-1248635507-e54e55?p (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

笔记-python-map的用法

map()函数 map()是 Python 内置的高阶函数&#xff0c;它接收一个函数 f 和一个 list&#xff0c;并通过把函数 f 依次作用在 list 的每个元素上&#xff0c;得到一个新的 list 并返回。 1、当seq只有一个时&#xff0c;将函数func作用于这个seq的每个元素上&#xff0c;并得到…

【御控工业物联网】 Java JSON结构转换、JSON结构重构、JSON结构互换(17):数组To对象——键值互换属性重组

文章目录 一、JSON结构转换是什么&#xff1f;二、核心构件之转换映射三、案例之《JSON数组 To JSON对象》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换…

轻兔推荐 —— plausible-analytics

简介 Plausible Analytics 是一个开源的、界面美观、简单易用的网站访问量统计工具。 - 易接入&#xff1a;仅需一行代码就可给网站添加统计数据。 - 数据指标统计完整&#xff1a;可直观查看外链来源、页面访问量排序、访问设备、访问地区等。 特点 无需Cookie&#xff…