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

Java虚拟机(JVM):内存区域

一、内存区域介绍

Java虚拟机(JVM)内存可以分为以下几个区域:

  1. 程序计数器(Program Counter Register):用于记录当前线程执行的字节码指令的地址,属于线程私有的区域。在任意时刻,一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器就是用来记录当前线程执行的方法字节码的指令地址,当线程执行Java方法时,程序计数器记录的是正在执行的虚拟机字节码指令的地址;当线程执行Native方法时,程序计数器的值为空(Undefined)。
  2. Java虚拟机栈(Java Virtual Machine Stacks):也是线程私有的区域,每个线程在创建时都会创建一个栈,用于存储方法的局部变量、操作数栈、动态链接、方法出口等信息。每个方法在执行时都会创建一个栈帧,用于存储方法的局部变量和部分运算结果。栈帧随着方法的进入和退出而有入栈和出栈的操作。如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机栈可以动态扩展,但无法申请到足够的内存时,将抛出OutOfMemoryError异常。
  3. 本地方法栈(Native Method Stacks):与虚拟机栈类似,但是用于执行Native方法。
  4. 堆(Heap):为所有线程共享的区域,用于存储对象实例。Java堆是Java虚拟机管理的最大的一块内存区域,也是垃圾回收器管理的主要区域。在虚拟机启动时创建,用于存储各种对象(包括实例对象和数组)。
  5. 方法区(Method Area):也是所有线程共享的区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。方法区在虚拟机启动时创建,存储了每个类的结构信息,包括运行时常量池、字段和方法数据、构造函数和类方法等。
  6. 运行时常量池(Runtime Constant Pool):是方法区的一部分,用于存放编译期生成的各种字面量和符号引用。运行时常量池具有动态性,可以在运行时进行扩充。
  7. 直接内存(Direct Memory):不是虚拟机运行时数据区的一部分,但是也被频繁地使用。在JDK 1.4中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。这样可以在一些场景中显著提高性能。 这些区域共同组成了Java虚拟机的内存布局,每个区域都有其特定的作用和用途,用于支持Java程序的正常执行和内存管理。

二、代码分析 

代码段一:

public class MemoryExample {// 静态变量-存储在方法区private static String staticVariable = "Hello, World!";// 实例变量-存储在堆中private String instanceVariable;public void method() {// 局部变量-存储在栈中int localVar = 10;System.out.println(localVar);// 对象实例化-对象存储在堆中,变量存储在栈中MemoryExample obj = new MemoryExample();obj.instanceVariable = "Java Memory";}public static void main(String[] args) {method(); // 静态方法调用-存储在栈中// 程序计数器-记录当前线程执行的字节码指令的地址int pc = 0;// 垃圾回收器对堆进行内存回收和分配Object obj = new Object();obj = null;System.gc();// 本地方法栈-存储本地方法的信息nativeMethod();}// 本地方法-不在Java虚拟机中执行,而是在本地操作系统中执行private static native void nativeMethod();
}

上述代码中,静态变量 staticVariable 存储在方法区,实例变量 instanceVariable 存储在堆中,局部变量 localVar 存储在栈中。静态方法 main() 存储在栈中,程序计数器记录当前线程执行的指令地址。 代码中还展示了对象的实例化,对象存储在堆中,变量存储在栈中。示例中的 MemoryExample obj = new MemoryExample(); 在堆中创建了一个对象实例,并将其引用存储在栈中的变量 obj 中。 此外,示例中还包含了对垃圾回收器的调用 System.gc(),用于对堆进行内存回收和分配。还展示了本地方法 nativeMethod(),它不在Java虚拟机中执行,而是在本地操作系统中执行,相关信息存储在本地方法栈中。

对于这个代码示例中的私有静态变量 staticVariable,实际上,它的初始化值 "Hello, World!" 也会存储在运行时常量池中。 在Java中,字符串常量字面量会被存储在运行时常量池中。当一个类被加载到内存中时,它的静态变量也会被初始化。对于字符串类型的静态变量,如果其初始化值是一个字符串常量字面量,那么该字符串常量字面量也会被存储在运行时常量池中。 因此,在代码示例中,初始化值 "Hello, World!" 会被存储在运行时常量池中。而静态变量 staticVariable 则是存储在方法区中,它持有对运行时常量池中 "Hello, World!" 字符串常量的引用。 需要注意的是,虽然 staticVariable 的值是一个字符串常量,它并不是直接存储在运行时常量池中,而是存储在方法区中的静态变量区域,并且该变量在运行时常量池中引用了对应的字符串常量。

代码段二:

public class MemoryExample {public static void main(String[] args) {// 字符串常量存储在运行时常量池中String str1 = "Hello";String str2 = "World";String str3 = str1 + str2; // 字符串拼接会在运行时常量池中创建新的字符串对象System.out.println(str3);// 类的全限定名存储在运行时常量池中String className = MemoryExample.class.getName();System.out.println(className);// 常量引用存储在运行时常量池中final int constantValue = 10;System.out.println(constantValue);}
}

在上述代码中,字符串常量 "Hello""World" 存储在运行时常量池中。通过字符串拼接操作 str1 + str2,会在运行时常量池中创建新的字符串对象 "HelloWorld"。类的全限定名 MemoryExample.class.getName() 也会存储在运行时常量池中。最后,常量引用 constantValue 的值 10 也会存储在运行时常量池中。 尽管代码示例中没有直接访问运行时常量池,但编译器和虚拟机会自动处理和使用运行时常量池中的数据,以满足程序的运行需求。

在代码示例中,字符串常量 "Hello" 存储在运行时常量池中,而变量 str1 存储在栈中,它持有对运行时常量池中字符串常量 "Hello" 的引用。 当代码执行到 String str1 = "Hello"; 这一行时,会先在运行时常量池中查找是否存在字符串常量 "Hello"。如果存在,那么变量 str1 就会直接引用该字符串常量;如果不存在,那么会在常量池中创建一个新的字符串常量 "Hello",然后变量 str1 引用这个新创建的字符串常量。 所以,变量 str1 存储在栈中,它的值是对运行时常量池中字符串常量 "Hello" 的引用。而字符串常量 "Hello" 存储在运行时常量池中,它的值是字符串的实际内容。

相关文章:

Java虚拟机(JVM):内存区域

一、内存区域介绍 Java虚拟机(JVM)内存可以分为以下几个区域: 程序计数器(Program Counter Register):用于记录当前线程执行的字节码指令的地址,属于线程私有的区域。在任意时刻,一…...

11 - git stash 开发中临时加塞了紧急任务怎么处理

查看所有文章链接:(更新中)GIT常用场景- 目录 文章目录 开发中临时加塞了紧急任务怎么处理 开发中临时加塞了紧急任务怎么处理 当你此时工作区已经修改了 Readme 文件,然后突然需要解决其他问题(紧急问题、新任务&…...

高效的WMS系统手持盘点方案

WMS系统手持盘点就是指利用WMS系统支持的手持式电子盘点设备进行库存盘点的方式。 具体来说: - 手持盘点设备是一种小型的电子设备,具有移动条形码扫描功能,可以实时与WMS系统联通。 - WMS系统利用手持设备,可以给仓储人员下发具体的盘点任务,例如需要盘点的货位、商品等信息…...

Oracle分页技术

1、使用两层嵌套 SELECT *FROM (SELECT A.*, ROWNUM RNFROM (SELECT * FROM edw_t100_bal_all) AWHERE ROWNUM < 40)WHERE RN > 21; 2、使用between..and.. SELECT *FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM edw_t100_bal_all) A)WHERE RN between 21 and 40…...

2023-08-15 Untiy进阶 C#知识补充6——C#7主要功能与语法

文章目录 一、字面值改进二、out 内部声明 / 弃元三、ref 返回值四、本地函数五、抛出表达式六、元组七、模式匹配 ​ 注意&#xff1a;在此仅提及 Unity 开发中会用到的一些功能和特性&#xff0c;对于不适合在 Unity 中使用的内容会忽略。 ​ C# 7 对应 Unity 版本&#xff1…...

logstash配置文件

input { kafka { topics > “xxxx” bootstrap_servers > “ip:port” auto_offset_reset > “xxxx” group_id > “xxxx” consumer_threads > 3 codec > “json” } } filter { grok { match > { “message” > ‘%{IP:client_ip} - - [%{HTTPDATE:…...

docker搭建lnmp(nginx+mysql57+php7.4)

docker搭建lnmp(nginxmysql57php7.4) 1. 准备工作 docker安装 $ sudo yum update $ sudo sudo yum install -y yum-utils device-mapper-persistent-data lvm2 $ sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo $ sudo…...

专访 BlockPI:共建账户抽象未来的新一代 RPC 基础设施

在传统 RPC 服务板块上&#xff0c;开发者一直饱受故障风险、运行环境混乱等难题的折磨。实现 RPC 服务的去中心化&#xff0c;且保持成本优势和可扩展性&#xff0c;始终是区块链基础设施建设的重要命题之一。从 2018 年观察中心化 RPC 供应商服务现状开始&#xff0c;BlockPI…...

js fetch请求中断的几种方式

1、通过AbortController 这是官方标准手段&#xff0c;真正意义的阻止请求&#xff08;不支持ie&#xff09; 后端接口设置的两秒返回数据 function myFetch() {const controller new AbortController();const signal controller.signal;fetch(http://localhost:3000/aaa/…...

Python自动化实战之使用Selenium进行Web自动化详解

概要 为了完成一项重复的任务&#xff0c;你需要在网站上进行大量的点击和操作&#xff0c;每次都要浪费大量的时间和精力。Python的Selenium库就可以自动化完成这些任务。 在本篇文章中&#xff0c;我们将会介绍如何使用Python的Selenium库进行Web自动化&#xff0c;以及如何…...

“之江数据安全治理论坛”暨《浙江省汽车数据处理活动规定(专家建议稿)》研讨会顺利召开

研讨会主题 8月10日&#xff0c;“之江数据安全治理论坛”暨《浙江省汽车数据处理活动规定&#xff08;专家建议稿&#xff09;》研讨会在浙江大学计算机创新技术研究院举办。 本次研讨会的主题聚焦于“智能网联汽车的数据安全与数据合规”&#xff0c;邀请行业主管部门和数据…...

消息中间件面试题

异步发送(验证码、短信、邮件…) MYSQL和Redis&#xff0c;ES之间的数据同步 分布式事务 削峰填谷 RabbitMQ如何保证消息不丢失&#xff1f; 开启生产者确认机制&#xff0c;确保生产者的消息能到达队列 开启持久化功能&#xff0c;确保消息未消费前在队列中不会丢失 开启消费…...

麻辣烫数据可视化,麻辣烫市场将持续蓬勃发展

麻辣烫&#xff0c;这道源自中国的美食&#xff0c;早已成为人们生活中不可或缺的一部分。它独特的香辣口味&#xff0c;让人忍不住每每流连忘返。与人们的关系&#xff0c;简直如同挚友一般。每当寒冷的冬日或疲惫的时刻&#xff0c;麻辣烫总是悄然走进人们的心房&#xff0c;…...

大数据课程J1——Scala的概述

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解Scala的特点; ⚪ 了解Scala的开发环境搭建; ⚪ 了解Scala的开发工具; 一、概述 1.简介 Scala既是面向对象的语言,也是面向函数的语言。scala可以为你在做大量代码重用和扩展是提…...

第二章:25+ Python 数据操作教程(第十三节NUMPY 教程与练习)

NumPy(“Numerical Python”或“Numeric Python”的缩写)是 Python 中对数组和矩阵进行快速数学计算的最基本的软件包之一。在处理多维数据时它也非常有用。集成C、C++和FORTRAN工具是一件幸事。它还提供了许多傅里叶变换 (FT) 和线性代数函数。 为什么使用 NumPy 而不是列…...

【Java面试】如果一个线程两次调用start(),会出现什么问题?

这个问题出自阿里p6岗位第一面的提问&#xff0c;你会回答吗&#xff1f; 在Java里面&#xff0c;一个线程只能调用一次start()方法&#xff0c;第二次调用会抛出IllegalThreadStateException异常。 一个线程本身是具备一个生命周期的。 在Java里面&#xff0c;线程的生命周…...

购买steam余额有风险吗?以及N种被红锁的情况

购买steam余额有风险吗&#xff1f;以及N种被红锁的情况 无论是打游戏的玩家&#xff0c;还是像我们这类靠倒卖装备赚钱的小商贩&#xff0c;都面临充值美金余额的问题&#xff0c;我们现在主要是找的专业充值渠道做代充。 最近我发现群里有极个别学员通过自己的方法找到了一…...

使用 BERT 进行文本分类 (02/3)

​ 一、说明 在使用BERT&#xff08;1&#xff09;进行文本分类中&#xff0c;我向您展示了一个BERT如何标记文本的示例。在下面的文章中&#xff0c;让我们更深入地研究是否可以使用 BERT 来预测文本是使用 PyTorch 传达积极还是消极的情绪。首先&#xff0c;我们需要准备数据…...

基于Hadoop的表级监管

现状 大数据平台中,采用hadoop的方式存储数据,hdfs本质上是文件系统,而文件系统对数据的监管能力有限,但是数据安全领域问题日渐凸显,现目前,大数据平台一般以分层结构进行授权,但是对于一线开发人员而言,是能够接触到整个大数据平台中的所有表的,那么如何实现这样一…...

【学习日记】【FreeRTOS】延时列表的实现

前言 本文在前面文章的基础上实现了延时列表&#xff0c;取消了 TCB 中的延时参数。 本文是对野火 RTOS 教程的笔记&#xff0c;融入了笔者的理解&#xff0c;代码大部分来自野火。 一、如何更高效地查找延时到期的任务 1. 朴素方式 在本文之前&#xff0c;我们使用了一种朴…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

Linux 下 DMA 内存映射浅析

序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存&#xff0c;但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程&#xff0c;可以参考这篇文章&#xff0c;我觉得写的非常…...