Java虚拟机学习(一)-运行时数据区

Java虚拟机(一)结构原理与运行时数据区域 本来计划要写Android内存优化的,觉得有必要在此之前介绍一下Java虚拟机的相关知识,Java虚拟机也并不是三言两语能够介绍完的,因此开了Java虚拟机系列,这一篇文章我们来学习Java虚拟机的结构原理与运行时数据区域。 阅读详情

作为一个Java程序员,如果要深入学习Java的话,那么了解Java虚拟机是必不可少的。通过学习Java虚拟机的知识,我们不仅可以了解Java的运行原理,而且也可以加深对Java编程的理解。
以前总觉得Java虚拟机是一种神秘的存在,理解起个肯定不容易,但是一些前辈确很推荐去学习一下。所以现在就计划开始学习Java虚拟机。在此,以博客的形式记录一下学习笔记和心得。
今天记录一下Java虚拟机运行时数据区。
在Java虚拟机中内存分为若干个数据区,我们经常说的有Java堆,Java虚拟机栈,除此之外还有程序计数器(也称PC寄存器),方法区,运行时常量池以及本地方法栈。接下来就记录一下这些数据区的作用和介绍。

程序计数器,也可以说是PC寄存器。
1.访问权限:线程所有;
2.作用:记录线程中执行方法的位置;
程序计数器是一块较小的内存,用来记录线程执行字节码指令的位置,没执行一条指令,程序计数器就会加1(这个1是指一个单位长度)。由于Java虚拟机是多线程的,而在任意时刻,在Java虚拟机中的线程只能执行一个方法,所以在线程切换时,线程可以根据程序计数器找到正确的执行位置。

Java虚拟机栈
1.访问权限:线程私有
2.作用:存储栈帧;
Java虚拟机栈是属于线程私有的,线程创建时Java虚拟机栈也随之创建,线程结束时,Java虚拟机栈也被释放。在方法执行的时候会创建一个栈帧存储于Java虚拟机栈用于存储局部变量、操作数栈、动态链接、方法出口以及一些过程结果等。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在Java虚拟机栈中的出栈和入栈的过程。

Java堆
1.访问权限:线程共享
2.作用:存放对象实例(类实例、数组对象等)
Java堆也就是GC堆,垃圾收集器就是用来管理Java堆的。Java堆在虚拟机启动时创建,用来存放对象实例和数组对象。在Java堆中的对象不用使用者主动销毁,这就是内存管理系统。
参数配置:-Xmx -Xms

方法区
1.访问权限:线程共享
2.作用:存储类的结构信息(运行时常量池、字段、方法数据)
方法区在虚拟机启动时创建。在Java虚拟机规范中,方法区是Java堆的一个逻辑部分,但是方法区在可以选择不实现垃圾收集。相对而言,垃圾收集在方法区很少出现,但这部分区域的数据也不是永远存在,方法区主要针对常量池的回收和类型的卸载

运行时常量池
1.访问权限:属于方法区
2.作用:存放编译器生成的字面量、符号引用等
运行时常量池是类或接口的常量池在运行时的一种表现形式,它包括了从编译期可知的数值字面量和到运行期解析后才能获得的方法或字段引用。也就是说常量不仅仅是在编译期才能产生,在运行时也可以有新的常量。比如String的intern方法就是如果在常量池中有相应的字面量则返回没有就加入常量池。

本地方法栈
本地方法栈主要服务于native方法。在Java虚拟机规范中没有规定本地方法栈所使用的语言,可以由虚拟机去实现。

栈帧
栈帧属于Java虚拟机栈,用来存储数据和部分过程的结果,同时也用来处理动态链接、方法返回值和异常处理。
栈帧随着方法的调用而创建,随着方法的结束而销毁。在Java虚拟机中每个线程在同一时刻只能执行一个方法,每个方法里面存在一个活动的栈帧。当前方法调用另外方法是启动一个新的栈帧,当方法返回时回到前一个栈帧,方法结束栈帧结束。每个栈帧都保有自己的局部变量表、操作数栈和指向当前方法所属类的运行时常量池的引用。

1.局部变量表:每个栈帧内部都包含一组称为局部变量表的变量列表。栈
帧中局部变量表的长度由编译期决定,并且存储于类和接口的二进制表示之中,既通过方法的Code 属性保存及提供给栈帧使用。一个局部变量可以保存一个类型为 boolean、byte、char、short、float、reference
和 returnAddress 的数据,两个局部变量可以保存一个类型为 long 和 double 的数据。

2.操作数栈:每一个栈帧内部都包含一个称为操作数栈的后进先出栈。栈帧中操作数栈的长度由编译期决定,并且存储于类和接口的二进制表示之中,既通过方法的 Code 属性保存及提供给栈帧使用。操作数栈所属的栈帧在刚刚被创建的时候,操作数栈是空的。Java 虚拟机提供一些字节码指令来从局部变量表或者对象实例的字段中复制常量或变量值到操作数栈中,也提供了一些指令用于从操作数栈取走数据、操作数据和把操作结果重新入栈。在方法调用的时候,操作数栈也用来准备调用方法的参数以及接收方法返回结果。

3.动态链接:每一个栈帧内部都包含一个指向运行时常量池的引用来支持当前方法的代码实现动态链接。在 Class 文件里面,描述一个方法调用了其他方法,或者访问其成员变量是通过符号引用来表示的,动态链接的作用就是将这些符号引用所表示的方法转换为实际方法的直接引用。类加载的过程中将要解析掉尚未被解析的符号引用,并且将变量访问转化为访问这些变量的存储结构所在的运行时内存位置的正确偏移量。

4.方法返回:栈帧负责方法调用返回,包括正常返回和异常返回。当方法正常返回时,栈帧负责通知调用者相关状态变化(局部变量表、操作数栈和被正确增加过来表示执行了该方法调用指令的程序计数器等)。当方法异常返回时,方法中没用处理该异常,调用者也无法获得正确的返回值。

Java虚拟机的数据区域就大致分为者几块。一个Java程序能够顺利的运行就是通过各个数据区的相互协调完成的。学习Java虚拟机的数据区,我们就能够对程序运行时的一些调度理解的更加透彻。

新版CKA2020-2020-10-13-真题试卷 2020年10月13日 真题 新版CKA考试已于2020年9月1日正式上线! 考试模式:线上考试 考试时间:2小时 认证有效期:3年 软件版本:Kubernetes v1.19 重考政策:可接受1次重考 经验水平:中級 题目数量:17题 01 Task - 英文 Create a new ClusterRole named deployment-clusterrole that only allows the creation of the following resource types: Depl 阅读详情

相关推荐

从流量到凭证:实战解析SMB协议中的NTLMv2/v1哈希提取与破解

本文详细解析了SMB协议中NTLMv2/v1哈希的提取与破解实战技巧。从流量捕获、哈希格式处理到Hashcat高效破解,提供了一套完整的操作指南。文章特别强调了NTLMv2和NTLMv1哈希的区别及处理要点,并分享了防护建议与检测方法,帮助安全人员提升渗透测试效率。

weixin_30642561的博客 116

java虚拟机学习 -- JAVA运行时数据区总结(一)

JAVA运行时数据区分为: 方法区,虚拟机栈,本地方法栈,堆,程序计数器 堆与方法区是共享区域,虚拟机栈,本地方法栈,程序计算器是线程私有的。 程序计数器: 是内存最小的一块区域,负责记录当前线程所执行字节码的行号。是唯一一块不会出现OutOfMemoryError的区域 程序运行java方法时,程序计数器记录的是,当前正在执行的虚拟机字节码指令地址,执行native方法时,计数器为空 ...

日薪灬越亿的博客 212

避开这些坑!用Python ReportLab生成PDF时字体处理与中文排版的5个关键技巧

本文针对Python ReportLab库在PDF自动化生成中常见的中文排版难题,提供了五个关键技巧。内容涵盖字体注册的稳健策略、段落样式的精细控制、表格内中文的换行对齐、页面布局管理以及性能优化,旨在帮助开发者彻底解决中文乱码、排版错位等问题,生成专业美观的PDF文档。

weixin_29250403的博客 624

JVM学习(一)Java虚拟机运行时数据区域

一、Java内存区域 1、运行时数据区域 根据《Java 虚拟机规范(Java SE 7 版)》规定,Java 虚拟机所管理的内存包括以下几个运行时数据区域: 1.1 程序计数器 程序计数器是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。字节码解释器在执行时通过改变计数器的值来选取下一条要执行的字节码的指令,分支、循环、跳转、异常处理、...

LUOKANG123321的博客 92

【华为OD机试真题 新系统】1043、魔法咒语组合 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

【华为OD机试真题 新系统】1043、魔法咒语组合 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2026e卷,od机试,2026E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2026华为od,如何备战华为od

KJ.JK 281

Kappa函数:测量一致性并计算置信区间的R语言包

Kappa函数是一种常用的统计量,用于衡量两个评估者之间的一致性。在R语言中,有一个名为"vcd"的包提供了计算Kappa函数以及相应的置信区间的功能。本文将介绍如何使用"vcd"包来计算Kappa函数的值,并进一步计算置信区间。Kappa函数的值介于-1和1之间,值越接近1表示评估者之间的一致性越高,值越接近-1表示评估者之间的一致性越低,值接近0表示评估者之间的一致性接近于随机。通过以上步骤,我们成功地使用R语言中的"vcd"包计算了Kappa函数的值和置信区间。接下来,我们可以使用"vcd"包中的。

2301_79331230的博客 1875

Java虚拟机学习(一)---java虚拟机运行时数据区

文章目录运行时数据区图示运行时数据区划分方法区(Method Area)堆(Heap)虚拟机栈(VM Stack)本地方法栈(Native Method Stack)程序计数器(Program Countor Register)直接内存(Direct Memory) 运行时数据区图示 运行时数据区划分 方法区(Method Area) 虚拟机栈(VM Stack) 本地方法栈(Native M...

一行Java的博客 413

Tesla v100 4张显卡组装机安装vllm和ollama在Ubuntu系统上的安装---AI大模型系统从零开始0032

本文提供Ubuntu22.04系统下vLLM的完整安装指南,适配4×32G Tesla显卡的单机4卡张量并行部署。教程包含:1)硬件要求(Ubuntu22.04、NVIDIA驱动≥535、CUDA12.1+);2)NVIDIA驱动自动安装方法;3)Python3.10虚拟环境配置;4)vLLM官方预编译包一键安装;5)单机4卡启动Qwen3.6-27B模型的完整参数说明(含FP8量化、多进程并行等关键配置)。文末附分布式部署的Ray集群方案参考链接,适用于多机8卡场景。

添柴程序猿的专栏 176

【深入理解JAVA虚拟机学习笔记一】JAVA虚拟机运行时的数据区

程序计数器(Program Counter Register) 在虚拟机的概念模型中,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理等基础功能都需要依赖这个计数器完成。 如果线程正在执行一个Java方法,这个计数器记录的时正在执行的虚拟机字节码指令的地址; 如果正在执行的时Native方法,这个计数器值为空(Undefined) 此内存区...

努力努力再努力m 304

【DDR3 控制器设计】(1)MIG IP 核的详解与配置

2:1 比例的用户接口数据总线宽度是 MIG 内存接口宽度的 4 倍,比如 MIG 中配置的数据位宽是 16 位,而 DDR 双边采样,所以用户接口是 MIG 内存接口的 4 倍即数据位宽为 64 位,同理可以得到如果设置为 4:1 则是 8 倍的数据位宽即数据位宽为 128 位。这里选择不使用OFF。以下为 MIG 和 DDR 之间的连接框图,可以看到框图的左边是用户接口,中间是 MIG 核,右边是需要控制的 DDR 接口,用户只需要去配置使用 MIG 核,就可以对 DDR 进行控制读写等操作。

记录学习历程 5359

支付宝h5参数如何实现跳转?(包含相关Demo代码)

🏆本文收录于专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家!持续更新中,up!up!up!!

**My Coding Family** 3245

Java虚拟机学习笔记(一)——JVM运行时数据区和常见内存错误

本人的“Java虚拟机学习笔记”系列,主要是参考《深入理解Java虚拟机》和《Java虚拟机规范(Java SE 8)》两本书,算是本人的学习笔记,供大家参考,如有问题,烦请指出谢谢! 一、运行时数据区 关于什么是“运行时数据区”,两本书上说得差不多,都很模糊,个人觉得大概就是Java虚拟机中用户线程能够接触的、控制的、动态更改的内存区域。根据《Java虚拟机规范(Java SE 8)

十二页的博客 1685

Kile5报错—> ARM-Compiler ‘Default Compiler Version 5‘ which is not available安装使用Compiler Version 5 的办法

Kile5报错—> ARM-Compiler ‘Default Compiler Version 5‘ which is not available安装使用Compiler Version 5 的办法

weixin_72050316的博客 1178

学习JAVA虚拟机笔记一:运行时数据区域

JAVA虚拟机运行时数据区主要包含:方法区、堆、虚拟机栈、本地方法栈和程序计数器。其中虚拟机栈、本地方法栈和程序计数器是线程隔离的数据区;方法区、堆是由所有线程共享的的数据区。1.程序计数器:是一块儿内存很小的区域,当前线程所执行的字节码的行号指示器,字节码解释器工作就是通过程序计数器的值来取下一条要执行的字节码指令,各个线程之间的程序计数器互不影响,独立存储,是线程私有的。2、虚拟机栈:也是线程...

oShunJian123的博客 201

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java虚拟机学习笔记(一)--运行时数据区域

强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan 前言 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分成若干个不同的数据区域。 程序计数器 是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器 程序计数器处于线程独占区,Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的...

至尊宝 2万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

深入理解java虚拟机学习笔记(一)java虚拟机运行时数据区域

java虚拟机运行时数据区域   java虚拟机内存管理图 java虚拟机运行时数据区分为线程共享区和线程独占区。 其中线程共享区中包括方法区和java堆;线程独占区包括虚拟机栈、本地方法栈、程序计数器。 下面对每部分分别进行解释: 一、程序计数器:     1.程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。     2.程序计数器处于线程独占...

u014191220的博客 256

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

《深入理解java虚拟机》之学习笔记(一)——运行时数据区域

java虚拟机在执行java程序的过程中会把它管理的内存划分成多个不同的数据区域。这些数据区域主要分为两大类。一类是随着虚拟机的启动而存在,另一类是随着用户进程的启动和结束而建立和销毁。java虚拟机管理的内存主要包括如下几个运行时数据区域:

411

Java虚拟机学习与总结(一)

写在开始,以下内容是我学习《深入理解Java虚拟机》一书的总结,如果想深入学习Java JVM,请忽略该文章。 该总结主要用于复习使用,如有任何错误或不清楚的地方欢迎评论或私信。 目录 运行时数据区域 HostSpot虚拟机 对象和方法区的垃圾回收 ...

weixin_44250106的博客 662

Java虚拟机学习与总结(二)

写在开始,以下内容是我学习《深入理解Java虚拟机》一书的总结,如果想深入学习Java JVM,请忽略该文章。 该总结主要用于复习使用,如有任何错误或不清楚的地方欢迎评论或私信。 目录 运行时数据区域 HostSpot虚拟机 对象和方法区的垃圾回收 ...

weixin_44250106的博客 401

JVM如何运行,揭秘Java虚拟机运行时数据区

介绍Java虚拟机运行时数据区的结构。在运行时数据区中,总的来说分为五个部分。程序计数器,本地方法栈和虚拟机栈是线程私有的,方法区和堆内存是线程共享的。

m0_62946761的博客 3733

Java 运行时数据区详解

本文主要介绍了Java运行时数据区相关内容,包括程序计数器、Java虚拟机栈、本地方法栈、堆、方法区等内容。

专注Java和MySQL领域知识分享 1990

Java虚拟机运行时数据区

目录 •写在前面 •程序计数器 •java虚拟机栈和本地方法栈 •java堆 •方法区 •写在前面 Java虚拟机运行时数据区是我们深入了解JVM的必经之路,那这是什么样的一个区域呢?Java虚拟机在执行Java程序的过程中,会把它所管理的内存划分若干个不同的数据区域,这些区域被赋予不同的用途,它们有着各自创建和销毁时间,有的区域是随着虚拟机进程启动而存在的,有的区域则是依赖用户线程...

BoCong-Deng的博客 1万+

Java 虚拟机系列一:一文搞懂 JVM 架构和运行时数据区

前言 之前写博客一直比较随性,主题也很随意,就是想到什么写什么,对什么感兴趣就写什么。虽然写起来无拘无束,自在随意,但也带来了一些问题,每次写完一篇后就要去纠结下一篇到底写什么,看来选择太多也不是好事儿,更重要的是不成体系的内容对读者也不够友好。所以以后的博客尽量按系列来写,不过偶尔也会穿插其他的内容。接下来一段时间我会把写博客的重点放在 JVM (Java Virtual Machine) 和 ...

IamHYN的博客 1465

Java虚拟机(JVM)(4)——运行时数据区

本文主要目的在于了解JVM运行时数据区以及内存结构,以便在学习类加载以及垃圾回收的时候能够如鱼得水。

知唔猪的博客 1638

《Java虚拟机原理图解》3、JVM运行时数据区

JVM运行时数据区(JVM Runtime Area) 其实就是指JVM在运行期间,其对计算机内存空间的划分和分配。本文将通过以下几个话题来讨论JVM运行时数据区。 Topic 1. JVM运行时数据区 里有什么?Topic 2. 虚拟机栈 是什么?虚拟机栈 里有什么?Topic 3. 栈帧是什么?栈帧 里有什么?Topic 4. 方法区 是什么?方法区 里有什么?

我的程序人生(亦山札记) 2万+

Java虚拟机——运行时数据区域

Java虚拟机——运行时数据区域,程序计数器,栈,堆,方法区,直接内存等

AIAIAIXIAO_的博客 1055
上一篇: git解决non-fast-forward冲突
下一篇: Java虚拟机学习(二)-内存管理
Coding-ls
博客等级 码龄11年 41粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值