【JVM 内存结构 | 程序计数器】

内存结构

  • 前言
  • 简介
  • 程序计数器
    • 定义
    • 作用
    • 特点
    • 示例
    • 应用场景

在这里插入图片描述

主页传送门:📀 传送

前言


Java 虚拟机的内存空间由 堆、栈、方法区、程序计数器和本地方法栈五部分组成。

简介


  JVM(Java Virtual Machine)内存结构包括以下几个部分:

  • 堆区(Heap):堆区是最大的一块内存区域,由所有线程共享。所有的对象实例以及数组都在这块内存中分配。
  • 方法区(Method Area):方法区用于存储已被 JVM 加载的类信息、常量、静态变量,以及即时编译器编译后的代码等数据。
  • 栈(Stack):每个线程在创建时都会创建一个 JVM 栈,每个方法在执行的时候都会创建一个栈帧,用于存储局部变量、操作数栈、动态链接、方法出口等信息。
  • 程序计数器(Program Counter Register):这是一块较小的内存空间,可以看作是当前线程所执行的字节码指令的行号指示器。
  • 本地方法栈(Native Method Stack):与 JVM 栈类似,但是本地方法栈主要用于执行本地方法。

图示如下:

在这里插入图片描述
  JDK 1.8 同 JDK 1.7 比,最大的差别就是:元数据区取代了永久代。元空间的本质和永久代类似,都是对 JVM 规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元数据空间并不在虚拟机中,而是使用本地内存。

程序计数器


定义


  程序计数器(PC 寄存器)是一块较小的内存空间,它是一个专用的寄存器,用于存储当前正在执行的指令在指令序列中的位置。

作用


  • 按照顺序依次执行指令序列中的指令,当执行到跳转指令时,需要根据跳转指令的目标地址更新程序计数器的值,以便下一条指令能够正确执行。
  • 实现异常处理和中断服务。当程序出现异常或被中断时,程序计数器的值会被保存下来,以便在异常或中断处理结束后能够正确地继续执行程序。

特点


  • 线程隔离性:每个线程拥有自己的程序计数器,一个线程无法直接访问和修改另一个线程的程序计数器。
  • 内存占用小:程序计数器占用的内存空间非常小,可以忽略不计。
  • 无OutofMemoryError:程序计数器是Java虚拟机规范中唯一一个没有规定任何OutOfMemoryError的区域。
  • 执行时有值:程序执行的时候,程序计数器有值,其记录的是程序正在执行的字节码的地址。
  • 执行本地方法时值为空:执行native本地方法时,程序计数器的值为空。原因是native方法是Java通过jni调用本地C/C++库来实现,非Java字节码实现,所以无法统计。

示例

public class ProgramCounterExample {
    public static void main(String[] args) {
        ProgramCounter pc = new ProgramCounter();

        pc.increment();
        System.out.println(pc.getValue());  // 输出 1

        pc.decrement();
        System.out.println(pc.getValue());  // 输出 0

        pc.setValue(pc.getValue() + 1);
        System.out.println(pc.getValue());  // 输出 1
    }
}

class ProgramCounter {
    private int value;

    public ProgramCounter() {
        value = 0;
    }

    public void increment() {
        value++;
    }

    public void decrement() {
        value--;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }
}

应用场景


  • 指令执行控制:程序计数器可以用于实现指令流水线,即每条指令执行时,程序计数器会自动增加,指向下一条要执行的指令。
  • 实现跳转:当程序执行到跳转指令时,程序计数器需要根据跳转指令的目标地址更新自身的值,以便下一条指令能够正确执行。
  • 实现异常处理和中断服务:当程序出现异常或被中断时,程序计数器的值会被保存下来,以便在异常或中断处理结束后能够正确地继续执行程序。
  • 实现多线程:在多线程环境中,每个线程拥有自己的程序计数器,用于记录该线程正在执行的指令序列。

在这里插入图片描述

  如果喜欢的话,欢迎 🤞关注 👍点赞 💬评论 🤝收藏  🙌一起讨论
  你的支持就是我✍️创作的动力!					  💞💞💞

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【一】ubuntu20.04上搭建containerd版( 1.2.4 以上)k8s及kuboard V3

k8s 部署全程在超级用户下进行 sudo su本文请根据大纲顺序阅读! 一、配置基础环境(在全部节点执行) 1、安装docker 使用apt安装containerd 新版k8s已经弃用docker转为containerd,如果要将docker改为containerd详见&#xff1a…

【K8S源码之Pod漂移】整体概况分析 controller-manager 中的 nodelifecycle controller(Pod的驱逐)

参考 k8s 污点驱逐详解-源码分析 - 掘金 k8s驱逐篇(5)-kube-controller-manager驱逐 - 良凯尔 - 博客园 k8s驱逐篇(6)-kube-controller-manager驱逐-NodeLifecycleController源码分析 - 良凯尔 - 博客园 k8s驱逐篇(7)-kube-controller-manager驱逐-taintManager源码分析 - 良…

多维时序 | MATLAB实现PSO-CNN-BiLSTM多变量时间序列预测

多维时序 | MATLAB实现PSO-CNN-BiLSTM多变量时间序列预测 目录 多维时序 | MATLAB实现PSO-CNN-BiLSTM多变量时间序列预测基本介绍模型特点程序设计参考资料 基本介绍 本次运行测试环境MATLAB2021b,MATLAB实现PSO-CNN-BiLSTM多变量时间序列预测。代码说明&#xff1a…

Matplotlib数据可视化(五)

目录 1.绘制折线图 2.绘制散点图 3.绘制直方图 4.绘制饼图 5.绘制箱线图 1.绘制折线图 import matplotlib.pyplot as plt import numpy as np %matplotlib inline x np.arange(9) y np.sin(x) z np.cos(x) # marker数据点样式,linewidth线宽,li…

猿辅导Motiff亮相IXDC 2023国际体验设计大会,发布新功能获行业高度关注

近日,“IXDC 2023国际体验设计大会”在北京国家会议中心拉开序幕,3000设计师、1000企业、200全球商业领袖,共襄为期5天的用户体验创新盛会。据了解,此次大会是以“设计领导力”为主题,分享全球设计、科技、商业的前沿趋…

9.Sentinel哨兵

1.Sentinel Sentinel(哨兵)是由阿里开源的一款流量控制和熔断降级框架,用于保护分布式系统中的应用免受流量涌入、超载和故障的影响。它可以作为微服务架构中的一部分,用于保护服务不被异常流量冲垮,从而提高系统的稳定…

StreamingWarehouse的一些思考和未来趋势

300万字!全网最全大数据学习面试社区等你来! 一篇笔记。 以Hudi、Iceberg、Paimon这几个框架为例,它们支持高效的数据流/批读写、数据回溯以及数据更新。具备一些传统的实时和离线数仓不具备的特性,主要有几个方面: 这…

接口文档管理解决方案调研及Torna+Smart-doc的使用

文章目录 一、现状二、需求三、调研Swagger官方地址介绍 Knife4j官方地址介绍 Apifox官方地址介绍 Smart-doc Torna官方地址介绍 EasyYapi Yapi官方地址介绍 四、对比(一)Swagger1、部署方式2、优点3、缺点4、分享方式 (二)Knif…

VS+Qt 自定义Dialog

与QtCreator不同,刚用VS添加Qt Dialog界面有点懵,后整理了下: 1.右击项目,选择“添加-模块”,然后选择“Qt-Qt Widgets Class” 2.选择基类[1]QDialog,更改[2]ui文件名称,修改定义Dialog[3]对应类名&#…

学习Linux的注意事项(使用经验;目录作用;服务器注意事项)

本篇分享学习Linux过程中的一些经验 文章目录 1. Linux系统的使用经验2. Linux各目录的作用3. 服务器注意事项 1. Linux系统的使用经验 Linux严格区分大小写Linux中所有内容以文件形式保存,包括硬件,Linux是以管理文件的方式操作硬件 硬盘文件是/dev/s…

第4篇:vscode+platformio搭建esp32 arduino开发环境

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 1.配置默认安装路径,安装到D盘。 打开环境变量,点击新建 输入变量名PLATFORMIO_CORE_DIR与路径:D:\PLATF…

SpringBoot案例-配置文件-@ConfigurationProperties

问题分析 在往期的配置参数的文章中,对于阿里云OSS的参数时设置在yml配置文件中,然后使用Value(”${}“)对参数进行赋值,具体如下: 此种方法比较繁琐 问题解决 使用注解 Data 为变量自动生成get/set方…

游戏反外挂方案解析

近年来,游戏市场高速发展,随之而来的还有图谋利益的游戏黑产。在利益吸引下,游戏黑产扩张迅猛,已发展成具有庞大规模的产业链,市面上游戏受其侵扰的案例屡见不鲜。 据《FairGuard游戏安全2022年度报告》数据统计&…

IP协议报文结构

IP报文结构 4位版本号: 指定IP协议的版本, 对于IPv4来说, 就是4.4位头部长度: IP头部的长度是多少个32bit, 也就是 length * 4 的字节数. 4bit表示最大的数字是15, 因此IP头部最大长度是60字节.8位服务类型: 3位优先权字段(已经弃用) 4位TOS字段 1位保留字段(必须置为0). 4位…

C语言练习1(巩固提升)

C语言练习1 选择题 前言 “人生在勤,勤则不匮。”幸福不会从天降,美好生活靠劳动创造。全面建成小康社会的奋斗目标,为广大劳动群众指明了光明的未来;全面建成小康社会的历史任务,为广大劳动群众赋予了光荣的使命&…

缓存的设计方式

问题情况: 当有大量的请求到内部系统时,若每一个请求都需要我们操作数据库,例如查询操作,那么对于那种数据基本不怎么变动的数据来说,每一次都去数据库里面查询,是很消耗我们的性能 尤其是对于在海量数据…

和鲸 ModelWhale 与中科可控多款服务器完成适配认证,赋能中国云生态

当前世界正处于新一轮技术革命及传统产业数字化转型的关键期,云计算作为重要的技术底座,其产业发展与产业规模对我国数字经济的高质量运行有着不可取代的推动作用。而随着我国数字上云、企业上云加快进入常规化阶段,云计算承载的业务应用越来…

VBA技术资料MF44:VBA_把数据从剪贴板粘贴到Excel

【分享成果,随喜正能量】人皆知以食愈饥,莫知以学愈愚,生命中所有的不期而遇都是你努力的惊喜.人越纯粹,就越能感受到美。大江、大河、大海、大山、大自然,这些风景从来都不会受“属于谁”的污染,人人都感受到它们的美…

解密长短时记忆网络(LSTM):从理论到PyTorch实战演示

目录 1. LSTM的背景人工神经网络的进化循环神经网络(RNN)的局限性LSTM的提出背景 2. LSTM的基础理论2.1 LSTM的数学原理遗忘门(Forget Gate)输入门(Input Gate)记忆单元(Cell State)…

正则中常见的流派及其特性

目前正则表达式主要有两大流派(Flavor):POSIX 流派与 PCRE 流派。 1、 POSIX 流派 POSIX 规范定义了正则表达式的两种标准: BRE 标准(Basic Regular Expression 基本正则表达式);ERE 标准&am…