java八股-jvm入门-程序计数器,堆,元空间,虚拟机栈,本地方法栈,类加载器,双亲委派,类加载执行过程

server/2024/11/18 23:08:10/

文章目录

  • PC Register
  • 虚拟机栈
  • 方法区(Metaspace元空间
  • 双亲委派机制
    • 类加载器
  • 类装载的执行过程

在这里插入图片描述

在这里插入图片描述

PC Register

程序计数器(Program Counter Register)是 Java 虚拟机(JVM)中的一个组件,它在 JVM 的内存模型中扮演着非常重要的角色。程序计数器是一块较小的内存空间,它的作用可以简单概括为:

  1. 存储指令地址:程序计数器用于存储指向下一条指令的地址,即当前线程执行的字节码的行号指示器。因为 JVM 执行的是字节码,所以程序计数器中存储的是字节码指令的地址。

  2. 线程私有:每个线程都有自己的程序计数器,这意味着它是线程私有的内存区域。这确保了在多线程环境中,不同线程执行的指令不会相互干扰。

  3. 上下文切换:在多线程环境中,当线程从执行状态切换到等待状态或被阻塞时,JVM 需要保存当前线程的程序计数器的值,以便在线程重新获得 CPU 时间片时能够从上次停止的地方继续执行。

  4. 分支跳转:程序计数器还负责分支跳转,比如循环、条件判断、方法调用等。当执行跳转指令时,程序计数器会更新为跳转目标的地址。

  5. 异常处理:在异常发生时,程序计数器也用于确定异常发生的位置,以便异常处理机制能够正确地捕获和处理异常。

程序计数器是 JVM 内存模型中唯一没有规定任何OutOfMemoryError(内存溢出错误)的区域。这是因为程序计数器的内存空间通常非常小,仅用于存储一个地址值,因此不存在内存不足的情况。

在实际的 JVM 实现中,程序计数器可能不直接以一个单独的内存区域存在,而是通过其他方式实现,比如在线程的栈中维护一个指向当前执行字节码指令的指针。无论如何实现,程序计数器的核心功能和作用都是相同的。

jdk8和jdk7的区别?

永久代挪到了本地内存的元空间区域,是java八的优化,防止堆内存设置小了,导致存储的静态变量,常量,类信息爆空间,设置大了又浪费内存空间,直接放到本地内存里面就完事儿了!
在这里插入图片描述
堆主要还是保存对象和数组。
如果对象被GC多次之后依然存活,那么会从伊甸园区(Eden)挪到s0,再挪到s1,最后挪到老年代区。
s0和s1是幸存者区域(survivor区)
在这里插入图片描述

虚拟机栈

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

方法区(Metaspace元空间

jdk8,永久代变成MetaSpace元空间,占用本地内存
在这里插入图片描述
元空间主要还是存储类信息,静态变量,常量,编译好的代码

双亲委派机制

java会把源代码编译为字节码,再由类加载系统加载到运行时数据区
在这里插入图片描述

类加载器

类加载器:吧字节码文件加载到JVM内存里面

  1. 当加载一个类时,先判断此类是否已经被加载,如果类已经被加载则返回;

  2. 如果类没有被加载,则先委托父类加载(父类加载时会判断该类有没有被自己加载过),如果父类加载过则返回;如果没被加载过则继续向上委托;

  3. 如果一直委托都无法加载,子类加载器才会尝试自己加载。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

类装载的执行过程

标红的表示当前执行到的阶段
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/server/143015.html

相关文章

鸿蒙NEXT开发案例:光强仪

【引言】 本文将介绍如何使用鸿蒙NEXT框架开发一个简单的光强仪应用,该应用能够实时监测环境光强度,并给出相应的场景描述和活动建议。 【环境准备】 电脑系统:windows 10 开发工具:DevEco Studio NEXT Beta1 Build Version: …

企业BI工具如何选择?主流5款BI工具多维对比

数据大爆炸时代,企业数据爆发式增长,来自产品、运营、价值链以及外部的数据都成指数级增长趋势。利用大数据分析实现精细化运营,驱动业务增长是企业的理想蓝图。而BI工具能够整合、分析并可视化复杂的数据集,帮助管理层和决策者快…

Java结合ElasticSearch根据查询关键字,高亮显示全文数据。

由于es高亮显示机制的问题。当全文内容过多,且搜索中标又少时,就会出现高亮结果无法覆盖全文。因此需要根据需求手动替换。 1.根据es的ik分词器获取搜索词的分词结果。 es部分: //中文分词解析 post /_analyze {"analyzer":"…

Javascript高级—数组去重的5种方式

JavaScript高级——数组去重的几种方式 在JavaScript编程中,数组去重是一个常见的需求,特别是在处理大量数据时。数组去重意味着从数组中移除重复的元素,只保留唯一的元素。JavaScript提供了多种方法来实现数组去重,每种方法都有…

若依笔记(十):芋道的菜单权限与数据隔离

目录 若依实现 菜单权限 按钮权限 数据隔离 在之前用户权限体系与数据隔离与前后端token鉴权体系中详细地说明了若依是如何实现登录鉴权与登录后菜单/按钮权限控制与数据控制的,本文基于芋道源码+vue3前端(2.2版本)研究它是怎么实现菜单权限控制与数据隔离的; 若依实现…

21.UE5游戏存档,读档,函数库

2-23 游戏存档、读档、函数库_哔哩哔哩_bilibili 目录 1.存档蓝图 2.函数库 2.1保存存档 2.2读取存档: 3.加载游戏,保存游戏 3.1游戏实例对象 3.2 加载游戏 3.3保存游戏 这一节的内容较为错综复杂,中间没有运行程序进行阶段性成果的验…

linux文件与重定向

目录 一、共识原理 二、回顾C语言文件函数 1.fopen 2.fwrite 3.fclose 三、文件系统调用 1.open 2.write 3.访问文件的本质 4.stdin&&stdout&&stderror 5.文件的引用计数 四、重定向 1.文件描述符的分配规则 2. 输出重定向 3.重定向系统调用 4.…

Streamlit:快速搭建数据科学应用的利器

Streamlit:快速搭建数据科学应用的利器 随着数据科学的不断发展,将分析结果以交互式应用的形式展示出来变得越来越重要。然而,传统的 Web 开发通常需要掌握前端、后端等多种技能,这对大多数数据科学家来说是一个门槛。幸运的是&a…