深入理解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,一经查实,立即删除!

相关文章

如何选情绪龙头

一、情绪龙头的特性及选股指标 情绪龙头股在市场中的表现往往具有独特的特性,这些特性不仅反映了市场的情绪波动,也为投资者提供了重要的选股依据。以下是情绪龙头股的十大特性及其对应的选股指标: 1. 高波动性 情绪龙头股通常具有极高的股…

启动软件是用例吗

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

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

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

弄巧成拙的 PFC(Priority-based Flow Control)

先说几句车轱辘话,TCP 性能低,所以 RDMA,以太网丢包,所以 PFC,网卡不能太复杂,所以 GBN… HPC,AI 对吞吐,时延要求非常高,同时需要更多计算资源,而 TCP 处理…

指标+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(标签页) 这几个概念。这些概念有不同的用途和功能,理解它们之…

C# WPF 打印机

C# WPF 打印机 打印机接口打印文本打印图片打印机属性对话框设置默认打印机搜索打印机 打印机接口 PrintServerPrintQueuePrintDocument 打印文本 /// <summary> /// 打印文本 /// </summary> /// <param name"text"></param> /// <pa…

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

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

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

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

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

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

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

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

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

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

Java与HTML:构建静态网页

在Web开发领域&#xff0c;HTML是构建网页的基础标记语言&#xff0c;而Java作为一种强大的编程语言&#xff0c;也能够在创建HTML内容方面发挥重要作用。今天&#xff0c;我们就来探讨一下如何使用Java来制作一个不那么简单的静态网页。 一、项目准备 首先&#xff0c;我们需…

Java 中的 Consumer:让操作与输出更简洁灵活

文章目录 1. Consumer 基础&#xff1a;单一操作的便捷实现2. forEach 与 Consumer&#xff1a;循环中的简化操作3. 链式 Consumer&#xff1a;andThen 实现多个操作4. 配合 Map 使用&#xff1a;多用途数据处理5. 定义通用 Consumer&#xff1a;增强代码复用6. Consumer 配合 …

VMware Fusion和centos 8的安装

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

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

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

LabVIEW扫描探针显微镜系统

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