当前位置: 首页 > article >正文

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

文章目录

  • 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.kler.cn/a/399327.html

相关文章:

  • Python中的正则表达式教程
  • Essential Cell Biology--Fifth Edition--Chapter one (8)
  • C++之内存管理
  • 大模型论文精华-AI在医疗诊断、语言学习与情绪识别等领域的最新应用进展
  • python机器人Agent编程——多Agent框架的底层逻辑(上)
  • WebSocket简易聊天室实现(有详细解释)
  • 121、SQL Server取开始时间、截止时间
  • 阿里云引领智算集群网络架构的新一轮变革
  • 上交大与上海人工智能研究所联合推出医学多语言模型,模型数据代码开源
  • C++中的单例模式(Singleton)全面讲解与实际案例
  • 室内定位论文精华-无人机与机器人在地下与室内环境中的自主导航与定位新技术
  • 数据结构------队列(Java语言描述)
  • C# 反射与动态编程
  • 本草智链:中药实验管理的区块链应用
  • web前端开发--网页
  • C++(Qt)软件调试---内存泄漏分析工具MTuner (25)
  • 199. 二叉树的右视图【 力扣(LeetCode) 】
  • 深挖C++赋值
  • 在Ubuntu22.04上源码构建ROS noetic环境
  • Harmony错题本--@Preview标注上依然无法预览
  • vim教程
  • 全媒体数字化转型浪潮下半场,有效流量创新业务是转型成功与否的最好证明
  • Brave127编译指南 Windows篇:获取源码(六)
  • 2024.11.16上午Linux上课笔记
  • C++泛型编程-函数模板、类模板
  • 使用Web Animations API实现复杂的网页动画效果