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

JVM运行时数据区内部结构

VM内部结构

对于jvm来说他的内部结构主要分成三个部分,分别是类加载阶段,运行时数据区,以及垃圾回收区域,类加载我们放到之后来总结,今天先复习一下类运行区域

首先这个区域主要是分成如下几个部分

下面举个例子来解释一下

public class Example {// 静态变量static int staticVar = 10;// 实例变量int instanceVar;public static void main(String[] args) {// 局部变量int localVar = 20;// 创建对象Example example = new Example();example.instanceVar = 30;// 调用方法example.addAndPrint(localVar, 5);}// 两个数相加的方法public void addAndPrint(int a, int b) {int sum = a + b;System.out.println("Sum: " + sum);}
}

1. 方法区(Method Area)

方法区存储类的结构信息、常量池、字段、方法等。

  • 类结构Example.class 类的字节码、常量池、字段、方法等都存储在方法区。
    • 常量池:包含常量 staticVar = 10(常量池是类的静态数据部分)。
    • 方法信息:存储 main 方法、addAndPrint 方法的字节码。
    • 字段信息:存储类中的静态字段 staticVar 和实例字段 instanceVar

2. 堆区(Heap)

堆区存储所有通过 new 关键字创建的对象实例和数组。

  • 对象实例:当执行到 Example example = new Example(); 时,Example 类的一个实例会被分配到堆区。这个实例包含一个 instanceVar 字段,它的初始值是 0
  • 对象属性example.instanceVar = 30; 时,实例对象的 instanceVar 被更新为 30

3. 栈区(Stack)

栈区存储每个方法的局部变量和方法调用的参数、返回地址等。每当一个方法调用时,都会为该方法分配一个栈帧。

  • main 方法的栈帧
    • 存储局部变量 localVar = 20
    • 存储方法参数 args,即 String[] args(虽然我们没有用到,但它也会存在于栈帧中)。
    • 存储局部变量 example,它指向堆区中创建的 Example 对象。
  • addAndPrint 方法的栈帧
    • addAndPrint 方法有两个参数 ab,其中 a = localVar = 20b = 5,它们都存储在 addAndPrint 方法的栈帧中。
    • 存储局部变量 sum,用于存储两个数相加的结果。

4. 程序计数器(PC Register)

每个线程有一个程序计数器(PC),它保存当前线程正在执行的字节码指令的地址。对于每个线程,程序计数器是独立的。

  • main 方法的程序计数器:当执行 main 方法时,程序计数器指向 main 方法的字节码指令。指令顺序执行时,程序计数器会根据程序流程指向不同的代码行。
  • addAndPrint 方法的程序计数器:当 main 方法调用 addAndPrint(localVar, 5) 时,程序计数器会切换到 addAndPrint 方法,指向 addAndPrint 方法的字节码指令。

5. 本地方法栈(Native Method Stack)

本地方法栈用于支持 Java 调用本地方法(如 C/C++)。在这个例子中,Java 程序没有调用本地方法,因此本地方法栈没有被使用。

http://www.lryc.cn/news/504772.html

相关文章:

  • Navicat for MySQL 查主键、表字段类型、索引
  • 如何在谷歌浏览器中实现自定义主题
  • visual studio 2022 c++使用教程
  • 曝光三要素
  • 01-2 :PyCharm安装配置教程(图文结合-超详细)
  • 类OCSP靶场-Kioptrix系列-Kioptrix Level 1
  • Maven插件打包发布远程Docker镜像
  • VisualStudio vsix插件自动加载
  • Codesoft许可管理
  • Unity3D 3D模型/动画数据压缩详解
  • ffmpeg和ffplay命令行实战手册
  • 基于MobileNet v2模型的口罩实时检测系统实现
  • NEEP-EN2-2023-Section5PartB
  • PostgreSQL17.x数据库备份命令及语法说明
  • Java实现一个带头节点的单链表
  • 【图像配准】方法总结
  • LabVIEW汽车综合参数测量
  • 三相异步电动机没有气压怎么办?
  • 软件工程书籍推荐
  • 验证集和测试集的区别
  • OpenIPC开源FPV之Adaptive-Link天空端代码解析
  • Next.js流量教程:核心 Web Vitals的改善
  • 百度智能云千帆AppBuilder升级,百度AI搜索组件上线,RAG支持无限容量向量存储!
  • 构建树莓派温湿度监测系统:从硬件到软件的完整指南
  • 12.11数据结构-图
  • BERT模型入门(2)BERT的工作原理
  • python3 中的成员运算符
  • 【测试面试篇1】测试开发与开发|selenium实现自动化测试|设计测试用例|常见的测试方法|开发不认可提测试的bug该怎么办
  • 人大金仓数据linux安装注意事项
  • 【Maven】多模块项目的构建