深入理解JVM

news2024/11/13 9:19:04

文章目录

  • 1. JVM内存区域划分
  • 2. JVM中类加载过程
    • 类加载
      • (1)类加载的基本流程
      • (2)双亲委派模型

《深入理解java虚拟机》
在这里插入图片描述

在这本书前,面试官对于JVM也不是很了解。
这本书主要还是写个一下开发 JVM 的人。

1. JVM内存区域划分

一个运行起来的Java进程,就是一个JVM虚拟机
需要从操作系统中申请一大块内存

就会把这个内存,划分成不同的区域,每块区域都有不同的作用

(1)方法区(1.7及其之前)/元数据区(1.8)
这里存储的内容,就是类对象(.class文件,加载之后,就成为了类对象)

(2)堆(占据空间最大的区域)
这里存储的内容就是代码中,new的对象

(3)栈
这里存储的内容,就是代码执行过程中,方法之间的调用关系
在这里插入图片描述

(4)程序计数器
比较小的空间,主要就是存放一个“地址”表示下一条要执行的指令,在内存中的哪个地方(方法区里)
每个方法里面的指令,都是以二进制的形式,保存在类对象中

在这里插入图片描述

虚拟机栈,程序计数器,每个线程都有一份

JVM进程中,有10个线程,就会有10个虚拟机栈和10个程序计数器

但是Heap(堆区)和Metaspace(元数据区),在JVM进程中只有一份(每个线程,有自己的程序计数器和栈空间;这些线程,公用一份堆和方法区)
每个线程有自己私有的栈空间

给你一个代码,问你某个变量,是处在内存中的哪个区?
在这里插入图片描述

  • 在new Test()时,这个new 出来的 Test()在堆上,里面包含的成员变量也自然在堆上
  • Test t 中的 t 变量是一个引用类型,是一个局部变量,处在栈上
  • static int a 带有static修饰的是静态变量,也叫类属性,它包含在类对象中,处在方法区/元数据区

在这里插入图片描述

2. JVM中类加载过程

类加载

(1)类加载的基本流程

java代码会被编译成 .class 文件(包含了一些字节码),java程序要想运行起来,就需要让JVM读取到这些 .class文件,并且把里面的内容,构造成类对象,保持到内存的方法区中

书上和官方文档把这个类加载过程中,分为5个步骤:

  1. 加载:找到.class文件,打开文件,并且读取文件内容

(往往我们的代码中,会给某个类“全限定类名”)
例如 java.lang.String,java.util.ArrayList ,JVM就会根据这个类名,在一些指定目录范围内查找

  1. 验证:.class文件是一个二进制的格式(某个字节,都是有特定含义的)

验证格式是不是符合要求
在这里插入图片描述

  1. 准备:给类对象分配内存空间(最终的目的,是要构造一个类对象) 这里的分配内存空间,还没有初始化,此时这个空间上的内存的数值就是全0的

此时如果尝试打印类对象的static成员,就是全0的

  1. 解析:针对类对象中,包含的字符串常量进行处理,进行一些初始化操作


在这里插入图片描述
在这里插入图片描述
这个过程,也叫做:把“符号引用”(文件偏移量)替换成“直接引用”(内存地址)

  1. 初始化:针对类对象进行初始化

类中的各个属性设置好,初始化好static成员,还需要执行静态代码块,加载一下父类

(2)双亲委派模型

(查找优先级)
属于类加载中第一个加载步骤中的一个环节,负责根据 全限定类名,找到.class文件

类加载器,是JVM的一个模块
JVM中内置了三个类加载器:
1.BootStrap ClassLoader(爷)
2.Extension ClassLoader (父)
3.Application ClassLoader(子)

这个父子关系,不"继承"构成的,而是这几个ClassLoader 里有一个 parent 这样的属性,指向了一个父“类加载器”

双亲:parent 这个单词“双亲之一”

在这里插入图片描述

如果给定的类你是标准库的类,任务仍然会被交给孩子执行

6.没有扫描到,就会回到Extension ClassLoader
Extension ClassLoader 就会扫描负责的拓展库的目录,如果没有找到,还是把任务交给孩子执行;如果找到了,就执行后续的类加载操作,此时查找结束

7.如果没有扫描到,就会回到Application ClassLoader
Application ClassLoader 就会负责扫描当前项目和第三方库的目录,如果找到,就执行后续的类加载操作,如果没有找到,就会抛出一个ClassNotExcption

设计一套这样的流程,主要目的是为了确保,标准库的类,被加载的优先级最高,其次是拓展库,其次是自己写的类和第三方库

假设你在自己代码中,写了一个 java.lang.String ,实际JVM加载的时候,不会加载到你自己写的这个类,而是加载标准库的类

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

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

相关文章

c# 开发web服务 webserver

024-11-10<<<<<<<<<<<<<<<<<<<<<<<<<< 开始插件前Cyber_CallWeb acajax_dac_database_viewer 2024-11-10<<<<<<<<<<<<<<<<<<<<…

WPS 默认模板修改

重装系统把word自定义样式搞没了&#xff0c;安装office时间太长&#xff0c;转战wps 解决方案 打开wps 点击【新建】word空白文档 设置修改你自己的样式 点击文件–另存为–Microsoft Word 带宏的模板文件&#xff08;*.dotm&#xff09; 另存路径为如下&#xff1a; 查…

使用vite构建一个react网站,并部署到Netlify上

这篇教程中&#xff0c;我会教你如何用vite快速构建一个react网站&#xff0c;并把网站免费部署到Netlify上&#xff0c;让别人可以经由网址访问你的react网站。 1. 使用vite构建基础框架 npm create vitelatestcd vite-project npm install npm run dev2. 网站内容设计 3. 构…

GPT-5 一年后发布?对此你有何期待?

GPT-5 一年后发布?对此你有何期待? 在最新技术的洪流中,GPT-5即将登场。你是否在思考,它将为我们的生活和工作带来哪些变革?接下来的探索,或许可以启发你对未来的想象。让我们一起深入这场关于未来AI语言模型的讨论。 一、技术上的提升 1.1 更强的语言理解能力 想象一…

MPC5744P——UART通信

简介 快速通过官方的example工程跑通MPC5744P的UART通信。 一、软件工程 点击File->New->S32DS Project from Example&#xff0c;打开示例程序窗口。 选择MPC5744P->LINFlexD_UART_MPC5744P&#xff0c;点击Finish&#xff0c;创建UART的示例工程。 工程创建成功&…

安当ASP系统:适合中小企业的轻量级Radius认证服务器

安当ASP&#xff08;Authentication Service Platform&#xff09;身份认证系统是一款功能强大的身份认证服务平台&#xff0c;特别适用于中小企业。其中&#xff0c;简约型Radius认证服务器是安当ASP系统中的一个重要组成部分。以下是对该系统的详细介绍&#xff1a; 一、主要…

「Mac畅玩鸿蒙与硬件30」UI互动应用篇7 - 简易计步器

本篇将带你实现一个简易计步器应用&#xff0c;用户通过点击按钮增加步数并实时查看步数进度&#xff0c;目标步数为 10000 步。该项目示例展示了如何使用 Progress 组件和 Button 组件&#xff0c;并结合状态管理&#xff0c;实现交互式应用。 关键词 UI互动应用计步器Button…

(64)使用RLS自适应滤波器进行预测的MATLAB仿真

文章目录 前言一、仿真说明四、MATLAB仿真代码五、仿真结果总结与后续 前言 RLS&#xff08;递归最小二乘&#xff09;自适应滤波器是一种用于信号处理的算法&#xff0c;其原理基于最小二乘法。在时间序列分析中&#xff0c;RLS滤波器可以用于预测信号的下一个值。本文以股票…

Python小白学习教程从入门到入坑------第二十九课 访问模式文件定位操作(语法进阶)

一、访问模式 模式可做操作若文件不存在是否覆盖r只能读报错-r可读可写报错是w只能写创建是w可读可写创建是a只能写创建否&#xff0c;追加写a可读可写创建否&#xff0c;追加写 1.1 r r&#xff1a;只读模式(默认模式)&#xff0c;文件必须存在&#xff0c;不存在就会报错…

学习记录:js算法(八十九):电话号码的字母组合

文章目录 电话号码的字母组合思路一 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 如图 示例 1&…

【机器学习】均方误差(MSE:Mean Squared Error)

均方误差&#xff08;Mean Squared Error, MSE&#xff09;是衡量预测值与真实值之间差异的一种方法。在统计学和机器学习中&#xff0c;MSE 是一种常见的损失函数&#xff0c;用于评估模型的预测准确性。 均方误差的定义 假设有一组真实值 ​ 和模型预测的对应值 ​。均方误…

Uniapp安装Pinia并持久化(Vue3)

安装pinia 在uni-app的Vue3版本中&#xff0c;Pinia已被内置&#xff0c;无需额外安装即可直接使用&#xff08;Vue2版本则内置了Vuex&#xff09;。 HBuilder X项目&#xff1a;直接使用&#xff0c;无需安装。CLI项目&#xff1a;需手动安装&#xff0c;执行yarn add pinia…

Typora导出pdf手动分页和设置字体样式

手动分页 <div style"page-break-after: always;"></div>鼠标点击代码才会显示&#xff0c;不点击会隐藏。导出pdf时&#xff0c;该位置会分页 设置字体大小、加粗、居中、空格 <p style"font-size:30px; font-weight: bold; text-align: cen…

Linux相关概念和易错知识点(19)(HDD、Block group)

目录 1.HDD &#xff08;1&#xff09;HDD存储描述 &#xff08;2&#xff09;HDD结构图 &#xff08;3&#xff09;磁盘管理的分治思想 &#xff08;4&#xff09;硬盘中文件系统的整体划分图 2.Block group &#xff08;1&#xff09;文件管理 ①文件属性的存储 ②in…

【跟着官网学技术系列之Java】第1天之Java开胃菜

前言 在当今信息爆炸的时代&#xff0c;拥有信息检索的能力很重要。 作为一名软件工程师&#xff0c;遇到问题&#xff0c;你会怎么办&#xff1f;带着问题去搜索引擎寻找答案&#xff1f;亦或是去技术官网&#xff0c;技术社区去寻找&#xff1f; 根据个人经验&#xff0c;一…

网络自动化03:简单解释send_config_set方法并举例

目录 拓扑图设备信息 netmiko涉及方法send_config_set()方法的简单示例代码输出结果代码解释导入模块配置信息config_device_interface_description 函数主程序块总结 send_config_set方法参数&#xff1a;1. enter_config_mode2. config_commands3. enter_config_mode4. error…

vue2,vue3,uniapp,小程序实现前端url生成二维码

最近遇到一个项目&#xff0c;api返回url地址&#xff0c;前端通过地址生成二维码。 话不多说直接上代码&#xff0c;亲测有效&#xff0c;希望能帮助大家&#xff0c;同时如果有更好的方法希望大家能够分享 1、第一步&#xff0c;在项目的utils文件夹下面创建一个weapp-qrco…

openlayers实现图层裁剪,只展示关心区域,抹掉无关区域,“抠”地图

先给大家看一下效果: 很久没有用ol了,今天突发奇想,想完成一下在ol中如何实现图层裁剪,抹掉消除非关心区域的地图的操作。过去写了有关于遮罩和掩膜的教程,现在看来好像有点低级,不足以满足需求,于是我们重新来做一下。 首先要知道ol官方是支持canvas参数传递的,就是说…

SpringBoot框架:共享汽车管理的创新工具

5系统详细实现 5.1 管理员模块的实现 5.1.1 用户信息管理 共享汽车管理系统的系统管理员可以管理用户&#xff0c;可以对用户信息修改删除以及查询操作。具体界面的展示如图5.1所示。 图5.1 用户信息管理界面 5.1.2 投放地区管理 系统管理员可以对投放地区信息进行添加&#…

初学者指南:用例图——开启您的软件工程之旅

目录 背景&#xff1a; 基本组成&#xff1a; 关联&#xff08;Assciation&#xff09;&#xff1a; 包含&#xff08;Include&#xff09;&#xff1a; 扩展&#xff08;Extend&#xff09;&#xff1a; 泛化&#xff08;Inheritance&#xff09;&#xff1a; 完整银行…