深入理解JVM

文章目录

  • 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.mzph.cn/news/885470.shtml

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

相关文章

启动软件是用例吗

沙亚雄 2020-8-13 14:06 潘老师,你好,最近读了您的软件方法,结合自己的项目发现始终有一个疑问?那就是启动软件算不算一个用例,因为软件在启动的时候一般都要实例化一些对象,读一些配置文件等等。那启动软…

Ubuntu22.04中使用CMake配置运行boost库示例程序

Ubuntu22.04中使用CMake配置运行boost库示例程序 boost是一个比较强大的C准标准库,里面有很多值得学习的东西,比较asio网络库可以用来编写C TCP客户端或者TCP服务端接收程序。本文主要讲解如何在Ubuntu22.04中使用Cmake配置boost库,以及运行…

指标+AI+BI:构建数据分析新范式丨2024袋鼠云秋季发布会回顾

10月30日,袋鼠云成功举办了以“AI驱动,数智未来”为主题的2024年秋季发布会。大会深度探讨了如何凭借 AI 实现新的飞跃,重塑企业的经营管理方式,加速数智化进程。 作为大会的重要环节之一,袋鼠云数栈产品经理潮汐带来了…

Windows配置NTP时间同步

Windows下实现NTP时间同步 1、Windows时间服务(W32Time)2、Windows 时间同步的工作原理3、配置和管理 Windows 时间同步3.1 命令行工具:w32tm3.2 控制面板中的设置 4. 高级设置(Windows Server 环境)5.调整时间同步的间隔5.1 通过组策略调整时…

系统安全第七次作业题目及答案

一、 1.RBAC0 RBAC1 RBAC2 RBAC3 2.属性 身份标识 3.接入访问控制 资源访问控制 网络端口和节点的访问控制 二、 1.B 2.A 3.ABE 4.BCD 5.ABC 三、 1. 答:基于属性的访问控制(ABAC)是通过对实体属性添加约束策略的方式实现主、客体之…

Golang进阶

1.面向对象 1.1.golang语言面向对象编程说明 Golang 也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言。所以我们说 Golang 支持面向对象编程特性是比较准确的。Golang 没有类(class),Go 语言的结构体(st…

Node(节点)、Menu(菜单) 和 Tab(标签页)之间的关系

在系统开发中,尤其是在涉及到前端界面设计和后台管理系统时,我们经常会看到 Node(节点)、Menu(菜单) 和 Tab(标签页) 这几个概念。这些概念有不同的用途和功能,理解它们之…

Python数据分析案例64——杭帮菜美食探索数据分析可视化

案例背景 杭州是真没啥美食呀.....但是 总是还是有好吃的店家,于是就发挥专业长处,进行一下分析,看看杭帮菜的一些特点。。例如看看品种分布啊,类型分布啊,行政区的分布啊,店铺评分的一些分布啊&#xff0…

基于SSD模型的路面坑洼检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示: 基于SSD模型的路面坑洼检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】_哔哩哔哩_bilibili (一)简介 基于SSD模型的路面坑洼检测系统是在 Py…

《Python编程实训快速上手》第四天--字符串操作

一、处理字符串 1、单引号和双引号 Python中单双引号均可以表示字符串,区别在于: 1、双引号中可以使用到单引号 2、单引号字符串中如果要使用单引号,要使用到转义字符 \ \ \t \n \\ 原始字符串 在开始的引号前加r&#xf…

泷羽sec学习打卡-Windows基础命令

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 关于windows的那些事儿-Base 一、Windows-BaseWindows有哪些版本呢,有什么区别呢&#xff1f…

Node.js——fs模块-文件夹操作

1、借助Node.js的能力,我们可以对文件夹进行创建、读取、删除等操作 2、方法 方法 说明 mkdir/mkdirSync 创建文件夹 readdir/readdirSync 读取文件夹 rmdir/rmdirSync 删除文件夹 3、语法 其余的方法语法类似 本文的分享到此结束,欢迎大家评论区…

VMware Fusion和centos 8的安装

资源 本文用到的文件:centos8镜像 , VMware 软件包 , Termius 文件链接: https://pan.baidu.com/s/1kOES_ZJ8NGN-BnJl6NC7Sg?pwd63ct 安装虚拟机 先 安装 vmware ,然后打开,将下载的 iso 镜像拖入 拖入镜像文件iso Continue, 然后随便选…

【嵌入式开发——ARM】1ARM架构

嵌入式领域,使用ARM架构的芯片公司可不占少数吧,intel的x86架构主要占据PC、服务器市场,ARM架构主要占据移动市场。x86架构和ARM架构不同的主要原因,是背后使用的计算机指令集不同。计算机有自己的语言系统(汇编&#…

LabVIEW扫描探针显微镜系统

开发了一套基于LabVIEW软件开发的扫描探针显微镜系统。该系统专为微观尺度材料的热性能测量而设计,特别适用于纳米材料如石墨烯、碳纳米管等的研究。系统通过LabVIEW编程实现高精度的表面形貌和热性能测量,广泛应用于科研和工业领域。 项目背景 随着纳…

JavaScript day01 笔记

一、引入方式 JavaScript 程序不能独立运行&#xff0c;它需要被嵌入 HTML 中&#xff0c;然后浏览器才能执行 JavaScript 代码。通过 script 标签将 JavaScript 代码引入到 HTML 中 1️⃣内部 通过 script 标签包裹 JavaScript 代码&#xff08;一般就写在</script>的…

【Git】Liunx环境下Git的使用:“克隆,提交,推送“

目录 一、常用参数 二、我们为什么要使用Git&#xff1f; 三、创建远程仓库 第一步&#xff1a;创建对应代码托管平台账号。 第二步&#xff1a;在托管平台创建仓库 第三步&#xff1a;完善仓库内容&#xff08;选择性使用&#xff09; 开源和私有 四、克隆远程仓库到本…

机器人零位、工作空间、坐标系及其变换,以UR5e机器人为例

机器人中的主要坐标系 在机器人中&#xff0c;常用的坐标系包括&#xff1a; 基坐标系&#xff08;Base Frame&#xff09;&#xff1a;固定在机器人基座上的坐标系&#xff0c;用于描述机器人的整体位置和方向&#xff0c;是其他所有坐标系的参考点。 连杆坐标系&#xff08…

JavaSE:运算符 (学习笔记)

目录 一&#xff0c;算术运算符 【1】 共同点&#xff1a; 【2】 不同点&#xff1a; 二&#xff0c;关系运算符 三&#xff0c;逻辑运算符 2&#xff0c;&和&&的区别和联系 { |和||的区别和联系 }---两题类似 四&#xff0c;赋值运算符 五&#xff0c;拓展…

C++中类的默认成员函数

默认成员函数 1.构造函数2.析构函数3.拷贝构造函数4.赋值运算符重载4.1运算符重载4.2赋值运算符重载 #mermaid-svg-oipiwg9stvONvYK0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-oipiwg9stvONvYK0 .error-icon{f…