Runtime Data Area(运行时数据区域)

news2024/9/21 12:26:24

运行时数据区是JVM用来管理和存储Java程序执行过程中所需要的各种数据的区域,也成为JVM内存结构。JVM内存结构主要包括以下几个部分:

  1. 程序计数器(Program Counter Register)

程序计数器是一种特殊的内存区域,它可以在物理机器的寄存器中实现,也可以在虚拟机栈中实现。程序计数器是JVM中的一个非常重要的组成部分,它用于存储当前线程所执行的字节码指令的地址。当JVM在执行Java方法时,程序计数器用于记录当前执行的位置,以便下一次继续执行。

程序计数器是线程私有的,每个线程都有一个独立的程序计数器,因此可以避免多线程之间的干扰和竞争。程序计数器的容量比较小,一般为32位或64位,它的值存储在线程私有的虚拟机栈中。

  1. Java虚拟机栈(Java Virtual Machine Stacks)

栈内存是用于存储栈帧的内存空间,栈帧中包含操作数栈、方法出口和局部变量表等信息。每个线程都有自己的栈内存,栈内存的大小是固定的(默认1MB),在编译时就已经确定,且一旦分配无法改变。当一个方法被调用时,JVM会为该方法分配一块内存空间(栈帧),方法执行结束后,该空间会被释放。由于栈内存是线程私有的,因此不会出现线程安全问题。

局部变量表中存储方法内部声明的变量,操作数栈中存储参与运算或者赋值操作的值,可以是各种类型的数据,例如整型、浮点型、对象引用等。方法出口指的是返回地址,在一个方法执行完毕后需要返回到哪个方法继续执行的地址。

public class JVMStacksDemo {

    static void methodA() {
        int a = 0;
        int b = 10;
        methodB(a, b);
    }

    static int methodB(int a, int b) {
        int x = 100;
        int c = a + b + x;
        String str = "str";
        return c;
    }

    public static void main(String[] args) {
        int a = 20;
        int b = 20;
        methodA();
    }

}

main方法被调用时,JVM会为其创建一个栈帧,并将该方法的返回地址压入栈顶。该栈帧中包含了main方法的局部变量表和操作数栈。main方法中定义了两个整型变量ab,并将ab分别赋值为20。如下图,可以看到当前栈中有main方法的栈帧,且可以看到右侧局部变量表中包含main方法的命令行参数、定义的整型变量ab以及它们的值。

请添加图片描述
接着main方法调用methodA

此时,JVM会为methodA方法创建一个新的栈帧,并将该方法的返回地址压入栈顶。如下图可以看到栈中methodA的栈帧位于栈的顶部。

请添加图片描述
methodA中调用的methodB,在methodB的局部变量表中可以看到methodA传入的参数ab,定义的变量xc,引用数据类型变量str
请添加图片描述

当methodB执行完成后,methodB的栈帧出栈。methodA同理。最后main方法执行完毕,栈空间被释放。

请添加图片描述

请添加图片描述
请添加图片描述

  1. Java堆(Java Heap)

堆内存是Java程序中最大的一块内存,用于存储对象实例和数组。

在JVM启动时,会创建并分配一个初始大小的堆空间,这个大小可以通过JVM参数来指定。当堆空间不足时,JVM会自动扩展堆的大小。堆内存被所有线程共享,因此可能会出现线程安全问题。但通常情况下,Java对象的访问都是通过引用来进行的,因此不需要考虑对象本身的线程安全问题,而是需要考虑对引用的并发访问问题。

  • 堆内存存储的对象实例和数组都需要使用new关键字创建,如果没有使用new关键字,则存储在栈内存中。

  • 对象实例包括String、ArrayList、HashMap等java中的,也包括自定义的。

  • 堆内存还存储对象的实例变量,如Person类的name、age等实例变量。类的静态变量存储在方法区中,它们也是所有线程共享的。

  • 一些基本类型的包装类也是存储在堆内存中,如常用的包装类Integer、Long、Float、Double、Boolean、Byte、Short和Character等。

堆内存在逻辑上划分为新生代和老年代,新生代又分为Eden区、Survivor1区和Survivor2区。新生代主要存储生命周期较短的对象,而老年代则主要存储生命周期较长的对象。
当一个Java对象被创建时,它首先会被分配在Eden区。当Eden区满时,触发Minor GC垃圾回收,将仍然存活的对象复制到Survivor0区或Survivor1区中。当Survivor0区或Survivor1区满时,也会触发Minor GC,将仍然存活的对象复制到另一个Survivor区中。在经过多次GC后,仍然存活的对象会被移动到老年代中。

  1. 方法区(Method Area)

方法区是用于存储被加载的类的相关信息(包括类名、访问修饰符、常量池、字段描述、方法描述等)以及常量池中的字面量、符号引用等内容的内存空间。方法区在逻辑上是堆的一部分。

  • 方法区被所有线程共享,在JVM启动时被创建,JVM销毁时被销毁。JVM会根据实际情况自行调整方法区的大小。

  • 常量池、静态变量在jdk8之后,常量池和静态变量被转移到了元空间(Metaspace)中。

  • 方法区也是垃圾回收的目标之一,主要回收无用的类信息和常量池中的常量。

  1. 本地方法栈(Native Method Stacks)

本地方法是使用 C/C++ 或者其他本地语言编写的方法,它们不会像 Java 方法那样被编译成字节码,而是被编译成本地机器码。本地方法栈和栈内存类似,用于存储本地方法的调用栈和本地方法的局部变量。本地方法栈也是线程私有的。在执行本地方法时,JVM 将会在本地方法栈中创建一个栈帧,用来存储本地方法的参数和局部变量。和 Java 方法栈类似,栈帧由操作数栈和局部变量表组成,它们的作用也和 Java 方法栈一样。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/480698.html

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

相关文章

线索二叉树(前中后序线索化/遍历/画线索)

线索二叉树 文章目录 线索二叉树1 线索二叉树的基本概念2 线索二叉树的构造2.1 线索二叉树的存储结构2.2 给线索二叉树画线索2.2.1 中序2.2.2 先序2.2.3 后序 2.3 二叉树线索化代码实现2.3.1 通过中序遍历线索化2.3.2 通过先序遍历线索化2.3.3 通过后序遍历线索化 3 线索二叉树…

五一欢乐赛!题解

前言 有点一言难尽, 这次本来想的给大火减减压放了很多区域赛和省赛的签到题(还有一些是写过的题), 没想到打的并不是很理想, 还用了分数值想减少一些差距, 结果看起来好像让差距更大了, 尴尬 A题 Frozen Scoreboard https://codeforces.com/gym/104076/problem/D 济南站的中…

【MST+离线】ABC235 E - MST + 1

一开始想的是分类讨论,看那条边加了之后成不成环,如果不成环且权值在前n-1,则一定在MST里,不在前n-1则不在MST里;如果成环了,如果权值不在前n-1,则不在MST里,如果权值在前n-1&#x…

InstructGPT怎么准备和标记数据集

目录 1. 谁标记数据集 2. 数据集的来源 3.数据预处理 4. 标记数据集的方法 5. 数据多样性 6. 这样标记的数据的不足之处 名词解释 1. 谁标记数据集 OpenAI 公司在Upwork平台上和Scale AI公司聘请了大约 40 名承包商为他们标记数据,通过筛选测试(screening tes…

ros基础笔记

1创建工作空间 catkin_init_workspace 将文件夹初始化成ros文件 编译工作空间catkin_make vi ~/.bashrc 加入环境变量bashrc一下在任何终端都生效 catkin_create_pkg learning_communication通讯机制 std_msgs数据结构 rospy roscpp catkin_create_pkg mbot_description ur…

【C++】string类常用接口

目录 一、string类二、string类的常用接口1.string类对象的常见构造2.string类对象的容量操作3.string类对象的访问及遍历操作4.string类对象的修改操作5.string类非成员函数6.vs和g下string结构的说明 一、string类 STL的六大组件: 字符串是表示字符序列的类标准…

E. Train Hard, Win Easy(数学推导 + 前缀和)

Problem - E - Codeforces 这是一个有关竞赛编程的问题。Zibi 是一名竞赛编程教练,有 n 名选手想要备战。培训比赛具有一些不同寻常的规则——每个团队有两名成员和两个问题,每个选手都会编写其中一个问题的代码。当然,一个团队中的人将编写不…

ViveNAS - 一个基于LSM tree的文件存储实现 (一)

1. ViveNAS (GitHub - cocalele/ViveNAS) ViveNAS 是一个开源分布式的网络文件系统(NAS), 具有下面的特点: - 通过不同存储介质的结合,在高性能、低成本间寻找动态的平衡 - 解决数据的长期、低成本存储问题&#xff…

JVM-0428

执行引擎 执行引擎做什么的 执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引…

java基础入门-03

Java基础入门-03 10、字符串10.1.API10.1.1API概述10.1.2如何使用API帮助文档 10.2.String类10.2.1 String类概述10.2.2 String类的特点10.2.3 String类的构造方法10.2.4 创建字符串对象两种方式的区别10.2.5 字符串的比较10.2.5.1 号的作用10.2.5.2 equals方法的作用 10.2.6 用…

java web会话管理

在人机交互过程中,会话管理是指保持用户的整个会话活动的交互与计算机系统跟踪的过程。会话管理分为桌面会话管理、浏览器会话管理、Web会话管理。本书讨论的是Web会话管理(通常指的是session以及Cookie) , 也称为会话跟踪。 会话管理基本原理 使用隐藏…

机器学习笔记 图像特征提取器(卷积变体)的技术发展与演变

一、图像特征提取器简述 图像特征提取器是可用于从图像中学习表示的函数或模块。最常见的特征提取器类型是卷积,其中内核在图像上滑动,允许参数共享和平移不变性。 在深度学习技术的快速发展过程中,基于卷积也演变出来了若干新技术由于图像特征的提取,这里进行了一下简单梳…

[oeasy]python0145_版本控制_git_备份还原

git版本控制 回忆上次内容 上次我们了解了 try 的完全体 try 尝试运行 except 发现异常时运行的代码块 else 没有发现异常时运行的代码块 finally 无论是否发现异常最终都要运行的代码块 发现导入部分 可以再分为两个子模块一个输入 a一个输入 b 可以再拆分么?&…

【Python基础练习100题--第一篇:文件篇】

前言 这些题都是在B站的练习题,链接在这 对于刚学python的新手来说十分的适合, 可以加强和巩固我们的基础。 嘿嘿 一起噶油吧!🍉 🍉1.对学生成绩排序 # 这里对字典进行排序,同事使用到了sorted函数 # 这…

【安全工具】Httpx信息收集

文章目录 前言一、下载二、使用步骤1.帮助文档2.常用命令常用组合命令: 总结 前言 HTTPX 是一个功能强大的 HTTP 客户端工具,用于执行各种网络任务,例如发现 Web 应用程序漏洞、探测域名和端口等。它使用了 retryablehttp 库来运行多个探测器…

[计算机图形学]相机与透镜(前瞻预习/复习回顾)

一、相机 1.成像方法 成像方法有两种,合成和捕捉,我们之前所说的光栅化和光线追踪都属于合成的方法,也就是实际上不存在的东西。而另一种成像方法叫做捕捉成像,也就是把真实世界中存在的一些东西变成照片这就是捕捉成像&#xf…

【量化课程】01_投资与量化投资

文章目录 1.1 什么是投资1.1.1 经济意义上的投资1.1.2 投资的分类1.1.3 金融投资1.1.4 个人投资者投资品种1.1.5 投资VS投机 1.2 股票投资的基本流程1.3 常见的股票投资分析流派1.3.1 投资者分析流派 1.4 什么是量化投资1.4.1 量化投资基本概念1.4.2 量化投资的优势1.4.3 量化投…

C多线程、锁、同步、信号量

文章目录 一 线程函数1.1 创建线程1.2 线程退出1.3 线程回收1.4 线程分离:1.5 其他线程函数1.5.1 线程取消1.5.2 线程ID比较 二 线程同步2.1 互斥锁2.1.1定义2.1.2 初始化2.1.3 销毁2.1.4 加锁 、 常试锁、解锁2.1.5 互斥锁使用 2.2 死锁2.3 如何避免死锁2.4 读写锁…

05_从0运行,重定位,初始化,中断再到定时器

总结 这边简单讲讲,代码上电后从0开始发生了什么,为什么要重定位把代码复制到sdram, bin文件前面几条跳转函数都跳转去哪 中断产生后发生什么 重定位问题 1.为什么需要重定位 把程序从一个位置移到另一个位置 叫重定位 可以只重定位部分段的数据 也可以把所有的都重定位到sd…

Linux运维之shell基础

一.流程控制 1.if判断 基本语法: if [ 条件判断式 ] then 程序 elif [ 条件判断式 ] then 程序 else 程序 fi注意事项: ①[ 条件判断式 ],中括号和条件判断式之间必须有空格②if 后要有空格 例如,现在写一个if.sh脚本文件 #…