Java中JVM的内存区域划分

Java8-JVM内存区域划分白话解读 java作为一款能够自动管理内存的语言,与传统的c/c++语言相比有着自己独特的优势。虽然我们无需去管理内存,但为了防范可能发生的异常,我们需要对java内部数据如何存储有一定了解,已应对突发问题,写出更好的程序java程序在被编译成字节码后,由JVM执行,执行期间产生的所有数据,会被分门别类的存储在JVM预设好的区域里,具体情况如下所示以下为java8的内存分布图​Tips:红色是线程共享的,黄色是线程私有的接下来我们着重讨论Java8中的内存分布情况这部分内存在JVM中,由JVM直接分配,初始大小、最大 阅读详情

JVM的内存区域划分


Java程序交由JVM(Java Virtual Machine)执行的,因此下面讨论JVM内存区域划分;


一、Java程序执行过程

Java源代码(.java)被Java编译器编译成字节码文件(.class),再由JVM中的类加载器加载各个类的字节码文件,加载完毕后交由JVM执行引擎执行。

整个程序执行过程中,JVM会用一段空间存储程序执行期间所用的数据和相关信息,称为运行时数据区(JVM内存)。



二、运行时数据区组成

1 程序计数器(PC寄存器)

用以指示执行哪条指令;

由于程序计数器中存储的数据所占空间的大小不会随程序的执行而变动,因此不会发生内存溢出现象;


2 Java栈(虚拟机栈)

存放一个个的栈帧,每个栈帧对一个被调用的方法,在栈帧中包括局部变量表、操作数栈、指向当前方法所属类的运行时常量池的引用、方法的返回地址和一些额外的附加信息;

当线程执行一个方法时,随之创建一个对应的栈帧,并将建立的栈帧压栈;当方法执行完毕,将栈帧出栈;



2.1 局部变量表

存储方法中的局部变量(包括方法中声明的非静态变量和函数形参);

对于基本数据类型的变量,直接存储它的值;对于引用类型的变量,存储指向对象的引用;

2.2 操作数栈

程序中的所有计算过程都是借助于操作数栈完成的;

2.3 指向运行时常量池的引用

方法执行过程中可能用到类中的常量,则必须有一个引用指向运行时常量池;

2.4 方法的返回地址

当一个方法执行完,通过方法的返回地址返回之前调用它的地方;


3 本地方法栈

本地方法栈与Java栈的原理类似,区别在于Java栈是为执行Java方法服务,本地方法栈是为执行本地方法(Native Method)服务的;


4 方法区

存储每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等;

方法区被所有线程共享;

方法区中有一部分是运行时常量池;在类和接口被加载到JVM后,对应的运行时常量池就会被创建;


5 堆

存储对象本身以及数组(数组引用存放在Java栈中);

Java中,程序员不必关心空间释放,Java的垃圾回收机制自动进行处理;

堆被所有线程共享,在JVM中只有一个堆;






注明:此文章是转载海子的博文,详情见:http://www.cnblogs.com/dolphin0520/p/3613043.html


Oracle19c集群节点故障恢复:从主机重装到重新加入集群的完整指南 本文详细介绍了Oracle19c集群节点故障恢复的全过程,从主机重装到重新加入集群的完整指南。重点讲解了保持集群配置一致性、彻底清理故障节点残留信息和分阶段验证等关键恢复原则,帮助DBA高效解决节点故障问题,确保集群稳定运行。 阅读详情

相关推荐

SRAM ECC原理与应用:从汉明码到高可靠嵌入式系统设计

在嵌入式系统与高可靠性计算领域,内存数据完整性是系统稳定运行的基石。软错误(Soft Error)由宇宙射线或芯片内部粒子引发,可能导致存储单元发生位翻转,进而引发程序跑飞或数据损坏。为应对这一物理层挑战,错误校验与纠正(ECC)技术应运而生,其核心原理基于扩展汉明码,通过增加校验位实现单错误纠正、双错误检测(SECDED)能力。这项技术通过硬件透明纠错,在提升系统可靠性的同时,几乎不影响访问性能。在汽车电子、工业控制及航空航天等对安全性要求极高的场景中,ECC已成为保障长期稳定运行的关键硬件机制。本文聚焦

weixin_28728265的博客 529

JVM的内存区域划分

目录1、程序计数器(内存中最小的一块,里面保存了当前线程下一条执行的指令的地址)2、栈(保存局部变量和方法调用的信息) 3、堆 (成员变量和new出来的对象都在堆上)4、方法区(存储常量,静态变量,类对象等等) 总结:JVM内存区域划分 JVM的内存区域划分分为四个区域:程序计数器,栈,堆,方法区(现在也叫元数据区)。 每个线程只有一个程序计数器,所以每个程序计数器是线程私有的。操作系统是以线程为单位调度的,所以每个线程都需要记录自己当前执行到哪一步了,以便后续再次调用。 栈也是线程私有的,在我们调用方

yanxiang3306 3440

rk3576之imx415 4k@60fps

1;0;1;0;1;0;1;0;1;0;1;0;1;0;

darennet的专栏 705

JVM的运行时内存区域划分详细讲解

堆和栈在内存管理、分配方式、内存空间、内存分配速度、对象生命周期、内存碎片和内存使用等方面存在明显的差异。了解堆和栈的特点和用途,有助于合理地使用内存,提高程序的性能和稳定性。

qq_39939541的博客 3579

macOS 12.7.6部署Ollama+Dify避坑指南

本文介绍了在macOS 12.7.6系统下部署Ollama和Dify的详细步骤及避坑指南。主要内容包括:1)关闭系统完整性保护(SIP)以允许修改系统目录;2)安装特定版本的Docker(2.1.0.5)和docker-compose(v2.38.2)以避免兼容性问题;3)配置Ollama服务并下载nomic-embed-text和deepseek-r1:7b模型;4)针对macOS调整Dify的docker配置文件,包括延长超时时间、修改存储路径、增加资源限制等关键设置。文中提供了完整的命令操作步骤和配置

Hi20240217的博客 3101

国产化办公新选择:在银河麒麟V10上部署ToDesk远程桌面

本文详细介绍了在国产操作系统银河麒麟V10上部署ToDesk远程桌面的完整指南。作为国产远程控制工具,ToDesk在连接速度、系统适配性和用户体验方面表现优异,特别适合国产化办公场景。文章包含X86和ARM架构的安装步骤、常见问题排查及性能优化技巧,帮助用户高效实现远程办公。

weixin_33742618的博客 232

JVM内存区域划分

JVM运行时,将内存空间划分为堆、方法区、程序计数器、虚拟机栈和本地方法栈5个区域来管理。

tianyuxu的博客 599

[原创]Keil工程STM32F103C8T6无缝转换到STM32F103RCT6

有个项目,老版本是STM32F103C8T6,硬件资源不够了,新版本采用STM32F103RCT6。 无缝过渡,如下: 选定芯片 宏定义改为STM32F10X_HD,USE_STDPERIPH_DRIVER 删除原有的启动汇编文件,更换为高密度器件汇编文件 时钟系统紊乱? 那得看你程序怎么写: 先看F103时钟树 int main(void) { unsigned char stat...

江东风又起 2万+

JVM内存区域的划分

根据 JVM 规范,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。 程序计数器(线程私有):   是当前线程所执行的字节码的行号指示器,每条线程都要有一个独立的程序计数器,这类内存也称为“线程私有”的内存。   正在执行java方法的话,计数器记录的是虚拟机字节码指令的地址(当前指令的地址)。如果还是Native方法,则为空。   这个内存区域是唯一一个在虚拟机中没有规定任何OutOfMemoryError情况的区域。

weixin_57763462的博客 1212

使用cutoff包基于最小p值法方法计算最佳截断值(基于LIRI基因数据集) R语言

这个方法在生物学研究中具有重要的意义,能够帮助我们从大规模基因表达数据中准确地找到差异显著的基因。在上述代码中,calculate_p_values函数是一个自定义函数,用于计算差异表达基因的p值。在本文中,我们将介绍如何使用R语言的cutoff包来基于最小p值法方法计算最佳的截断值,以便筛选出差异显著的基因。通过以上步骤,我们成功地使用cutoff包基于最小p值法方法计算了最佳的截断值,并筛选出了差异显著的基因。最后,我们可以根据得到的最佳截断值将基因表达数据集进行筛选,提取出差异显著的基因。

ByteKnight的博客 1291

python3.12 百分百解决安装dlib失败问题【研究原理后Bug已解决】

python3.12 百分百解决安装dlib失败问题【研究原理后Bug已解决】 python3.12版本下安装dlib失败。截图如下。试了网上很多方法都失败,耗费了很多时间终于找到适用于python3.12版本安装dlib的方法,亲测百分百成功。几乎尝试了所有的方法都不太行。终于找到安装的方法了。 原因分析: 版本匹配问题。我们现在是python3.12 使用pip根本无法安装。下面我们一起手动安装,1分钟搞定。

一键难忘的博客 7129

JVM内存划分

JVM内存划分

m0_68642284的博客 1845

云原生之容器编排实践-在K8S集群中使用Registry2搭建私有镜像仓库

基于前面搭建的3节点 Kubernetes 集群,今天我们使用 Registry2 搭建私有镜像仓库,这在镜像安全性以及离线环境下运维等方面具有重要意义。作为测试环境,本次使用 Registry2 搭建了私有镜像仓库,实际生产环境建议使用 Harbor;创建了一个 local-storage 的 StorageClass ,并使用本地磁盘的方式创建使用 PV ,实际建议使用 NFS 。

Heartsuit的博客 2461

Java面试必备:JVM内存区域的划分

Java虚拟机(JVM)是Java程序运行的核心环境,它负责管理程序的内存、执行字节码以及处理垃圾回收等任务。理解JVM的内存区域划分对于编写高效、稳定的Java程序至关重要。本文将详细介绍JVM的内存区域划分,并通过流程图帮助读者更好地理解这些概念。

qq_58299462的博客 934

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JVM内存区域划分 Java8 和 Java21区别

Java 8的内存模型以堆、方法区、栈为核心,适合传统应用,但需要手动调优(如 GC、元空间大小)。Java 21在内存管理上更现代化:低延迟 GC(ZGC/Shenandoah)和虚拟线程减少停顿和内存占用。元空间和字符串常量池优化降低 OOM 风险。FFM API提供更安全的本地内存访问。建议追求低延迟、高吞吐量应用可升级到 Java 21,使用 ZGC 和虚拟线程。遗留系统仍可基于 Java 8,但需关注元空间和堆内存调优。

谢文峰的博客 1350

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

JAVA JVM的内存区域划分

JVM内存区域分为线程私有和共享两部分。线程私有包括:程序计数器(记录字节码行号,不会OOM)、虚拟机栈(存储方法调用信息,可能栈溢出)和本地方法栈(支持native方法)。线程共享区域有堆(存放对象实例)和方法区(存储类信息等,Java8后改为Metaspace)。堆外内存指直接内存。程序计数器不会OOM因其占用固定极小空间,仅存储行号。栈溢出发生在深度过大时,而堆是JVM最大的内存区域,几乎所有对象实例都在此分配。(149字)

best_virtuoso的博客 459

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

java面试-JVM内存区域划分

JVM内存划分 说到Java内存区域,刚开始接触java的人会下意识说出“堆栈”。这里要明确堆栈不是一个概念,而是两个概念,堆和栈是两块不同的内存区域,简单理解的话,堆是用来存放对象而栈是用来执行程序的。其次,堆内存和栈内存的这种划分方式比较粗糙,这种划分方式只能说明大多数程序员最关注的、与对象内存分配关系最密切的内存区域是这两块,Java内存区域的划分实际上远比这复杂。对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作去配对delete/free代码,不容易出现内存泄露

zhttly的博客 246

【JAVA】JVM 内存区域的划分

通常可以把 JVM 内存区域分为下面几个方面,其中,有的区域是以线程为单位,而有的区域则是整个 JVM 进程唯一的。首先,程序计数器在 JVM 规范中,每个线程都有它自己的程序计数器,并且任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的 Java 方法的 JVM 指令地址;或者,如果是在执行本地方法,则是未指定值(undefined)。第二,Java 虚拟机栈(Java Virtual Machine Stack),早期也叫 Java 栈。

m0_57042151的博客 175

java jvm内存地址_【java】JVM的内存区域划分

学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆、栈以及静态数据区。那么在Java语言当中,内存又是如何划分的呢?由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程:如上图所示,首先Java源代码文件(.java后缀)会被Jav...

weixin_39996141的博客 130

java jvm内存地址_JVM的内存区域划分

JVM的内存区域划分学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆、栈以及静态数据区。那么在Java语言当中,内存又是如何划分的呢?由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程:如上图所示,首先Java源代码文件(.ja...

weixin_39690963的博客 86

JAVA基础面试题:Java中的JVM内存区域划分与垃圾回收算法详解

张总:"Victor,你的回答非常全面,既有理论深度,又有实际经验。看来你对JVM的理解非常透彻。Victor张总:"今天的面试就到这里,期待与你共事!Victor:"我也很期待!

Victor_119的博客 1029

Java内存区域划分(JVM运行时数据区)

我们在谈Java内存区域的划分时,事实上指的就是JVM内存区域的划分。在了解JVM内存之前,先看一下Java程序具体的执行过程。 如上图所示,首先Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行。在整个程序执行过程中,JVM会用一段空...

Symon的博客 449

【Java面试笔记:进阶】25.谈谈JVM内存区域的划分,哪些区域可能发生OutOfMemoryError?

内存区域触发条件错误信息堆(Heap)对象过多或内存泄漏方法区(Metaspace)类加载过多或动态生成类虚拟机栈线程过多或栈帧过深本地方法栈Native方法调用栈溢出(较少见)直接内存堆外内存分配过多。

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 1470

java 虚拟机内存区域_JVM中的五大内存区域划分详解及快速扫盲

一、快速扫盲1. JVM是什么JVM是JavaVirtualMachine的缩写,即咱们经常提到的Java虚拟机。虚拟机是一种抽象化的计算机,有着自己完善的硬件架构,如处理器、堆栈等,具体有什么咱们不做了解。目前我们只需要知道想要运行Java文件,必须先通过一个叫javac的编译器,将代码编译成class文件,然后通过JVM把class文件解释成各个平台可以识别的机器码,最终实现跨平台运行代码。2...

weixin_29274337的博客 971

Java - JVM内存区域的划分

Java - JVM内存区域的划分

m0_65228708的博客 1154

【JVM】Java内存区域划分

作为一名Java程序员应该去了解和思考一下Java技术体系中的这些技术是如何实现的一、JVM概念1.1 JVM定义  JVM(Java Virtual Machine)意思是Java虚拟机。它是一个虚构出来的计算机。可在实际的计算机上模拟各种计算机功能。JVM有自己完整的硬件架构,例如处理器、堆栈和寄存器等,还具有相应的指令系统。1.2 JVM的作用  JVM是Java字节码执行的引擎,为Java...

CJYYYYY的博客 342
上一篇: Java中访问权限控制
下一篇: Java中异常处理
成功Run的Q
博客等级 码龄12年 197粉丝 322原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值