jvm 内存区域划分

一文带你搞懂JVM虚拟机的内存区域划分 阅读详情

运行时数据区域

Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域。
在这里插入图片描述

程序计数器

程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在 Java 虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

由于 Java 虚拟机的多线程是通过线程轮流切换、分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。

Java 虚拟机栈

Java 虚拟机栈(Java Virtual Machine Stack)也是线程私有的,虚拟机栈描述的是 Java 方法执行的线程内存模型:每个方法被执行的时候,Java 虚拟机都会同步创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

对虚拟机栈内存区域规定了两类异常状况:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出 StackOverflowError 异常;如果 Java 虚拟机栈容量可以动态扩展,当栈扩展时无法申请到足够的内存会抛出 OutOfMemoryError 异常。

本地方法栈

本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机栈为虚拟机执行 Java 方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native)方法服务。
本地方法栈也会在栈深度溢出或者栈扩展失败时分别抛出 StackOverflowError 和OutOfMemoryError 异常。

Java 堆

对于 Java 应用程序来说,Java 堆(Java Heap)是虚拟机所管理的内存中最大的一块。Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例.

Java 堆是垃圾收集器管理的内存区域。从回收内存的角度看,由于现代垃圾收集器大部分都是基于分代收集理论设计的,所以 Java 堆中经常会出现“新生代”“老年代”“永久代”“Eden 空间”“From Survivor 空间”“To Survivor 空间”等名词。如果从分配内存的角度看,所有线程共享的 Java 堆中可以划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB),以提升对象分配时的效率。

方法区

方法区(Method Area)与 Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。

运行时常量池

运行时常量池(Runtime Constant Pool)是方法区的一部分。Class 文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池表(Constant Pool Table),用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。

运行时常量池相对于 Class 文件常量池的另外一个重要特征是具备动态性,Java 语
言并不要求常量一定只有编译期才能产生,也就是说,并非预置入 Class 文件中常量池
的内容才能进入方法区运行时常量池,运行期间也可以将新的常量放入池中,这种特性
被开发人员利用得比较多的便是 String 类的 intern()方法。

直接内存

直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分。但是这部分内存也被频繁地使用,而且也可能导致 OutOfMemoryError 异常出现。

深入解析JVM内存区域划分:从理论到实践 Java虚拟机(JVM)是Java程序运行的核心环境,它负责管理内存分配、垃圾回收、字节码执行等关键任务。理解JVM的内存区域划分,对于优化Java应用性能、排查内存问题(如OutOfMemoryError、StackOverflowError)至关重要。本文将详细解析JVM的内存结构,涵盖各个区域的作用、特点、异常情况,并结合实际案例进行分析。 阅读详情

相关推荐

FlashAttention 快速安装指南(避免长时间编译)

FlashAttention 编译太慢?本篇提供无需编译的预编译 wheel 快速安装方案,适配多版本 Python、PyTorch 和 CUDA,极大节省部署时间!

Junseer的博客 9721

【JVM】JVM执行流程和内存区域划分

`Java` 不想重新编译,而是期望能够直接执行 - 先通过 `javac` 把 `.java` 文件==> `.class` 文件(字节码文件,包含的就是 `Java` 字节码,`Java` 自己搞的一套 `CPU` 指令) - 因为如果生成 `CPU` 直接能执行的指令的话,不同的 `CPU` 支持的指令就不一样,就不能在所有系统上执行 - 这样先把 `java` 代码转成对应的 `java` 字节码文件,然后在某个具体的系统平台上执行,此时通过 `JVM` 把上述的字节码转换成对应的 `CPU` 能

Yeeear的博客 1万+

MS建模mmt

一、流程:1.定义好每个原子力场类型:Edit Sets(分组) 2.加H(一般是仅与Al-O八面体中的Al相连的O原子)、给H分组 3.“make P1”、校核化学式(正确与否) 4.扩成超晶胞(Na-mmt:4*1*1,Ca-mmt:4*2*1,illite:2*1*1,由化学式而定) 5.置换阳离子: mmt:模型中每 32 个 Si 4+有 1 个被 Al 3+ 取...

weixin_30721899的博客 2174

JVM的内存区域划分

以上这些内存区域共同构成了 JVM 运行时的数据区域,不同区域在 Java 程序执行过程中承担着不同职责,协同保障程序的正常运行和内存的有效管理。

weixin_43521001的博客 1073

学习笔记:物理信息神经网络(PINN)

PINN 的强大在于它打破了传统数值方法的限制,将神经网络的非线性拟合能力与物理方程的严谨性结合起来。它在处理高维、数据稀缺、复杂物理约束的场景下尤其出色。当然,PINN 也有收敛慢、梯度消失等挑战,比如,复杂 PDE 可能导致梯度传播困难,收敛慢(梯度消失)、于具有快速变化特征的系统,如冲击波,标准 PINN 可能精度不足,需要改进策略,比如自适应采样或多尺度特征提取。但随着研究深入,这些问题正在不断被解决。物理或化学方程为什么往往是偏微分方程?什么是物理信息神经网络(PINN)?x_%7Bi%7D。

qq_52635735的博客 1万+

数字IC后端设计实现 | PR工具中到底应该如何控制density和congestion?(ICC2&Innovus)

数字IC后端设计实现中到底应该如何控制cell density和congestion?(ICC2和Innovus两种解决方案)

weixin_37584728的博客 7113

JVM内存区域划分

JVM全称Java Virtual Machine,也称java虚拟机。那什么是虚拟机呢,相信大家应该多多少少都有听说过。就是。简单粗暴的可以理解为可以在上面进行一些操作的一个计算机,但是这个计算机是虚拟的、不存在。

m0_63039919的博客 1797

【STK】手把手教你利用STK进行导弹和反导仿真04 - STK/MMT模块04 导弹飞行工具应用案例

(6)打开STK,导出的范围轮廓以我们定义的Iran区域目标不同的颜色显示,并将以对象浏览器中定义为区域目标。最后将生成的轨迹导出到STK进行显示和分析。(12)在场景中新创建两个Target,将它们命名为Target1和Target2,并将他们放置在发射的Launch的射程范围之内。(2)在STK中插入AreaTarget对象,在“插入STK对象”工具中,选择“区域目标”对象类型和“选择国家/地区”当前在“飞行列表”窗口中选择的飞行路径将显示较大的启动和目标图图标,并带有较粗的带注释的连接线。

weixin_44184852的博客 1701

JVM内存区域划分详解

JVM内存区域分为运行时数据区和直接内存。运行时数据区包括程序计数器、虚拟机栈、本地方法栈(均为线程私有)、堆和元空间(线程共享)。堆分为年轻代(Eden、Survivor区)和老年代,是GC主要区域;元空间存储类元数据。直接内存是堆外内存,用于NIO操作。常见内存异常包括堆溢出(OOM)、栈溢出(StackOverflowError)等。调优参数如-Xms/-Xmx控制堆大小,-Xss设置栈大小。理解JVM内存模型对性能调优和问题排查至关重要。

weixin_43076660的博客 780

[Unity开发] [PICO]避坑指南:PICO商店上传APP时PXR Platform APPID设定详解

PICO开发者上传Unity应用时常见的"APPID不符"问题,主要源于混淆了开发者后台两个不同位置的APPID。

每日出拳老爷子的博客 557

面向企业架构师的 SAP BTP 全景实践:多云、账户、运行时与端到端开发路径

摘要:SAP BTP为企业提供多云、多运行时(Cloud Foundry/Kyma/ABAP Cloud)的数字化转型平台,支持快速构建扩展应用。关键选择包括:1)根据合规与性能选择区域;2)区分Trial(90天限制)与Free Tier(无期限)方案;3)按场景选择运行时(CF适合微服务/Kyma适合云原生/ABAP Cloud适合S/4HANA扩展)。建议优先使用Free Tier进行POC,并通过BTP Cockpit统一管理,实现从验证到生产的平滑过渡。(150字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 256

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

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

qq_58299462的博客 935

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

jvm(一)——内存区域划分

前言:jvm内存划分为多个区域,每个不同的区域分别有着不同的功能和不同的用途,本篇博客旨在说清楚区域的划分、名称、属性以及作用,本篇博客是参考了多篇博客的结果,参考博客会在文章结尾进行说明。 上图中说明了堆中对象的分配来源,对象实例化在堆中,但是其引用可能在方法区(常量实例),或者虚拟机的栈帧中(java方法中的实例化)和本地方法栈中(本地方法对象的实例化),在下面有详细说明。 一.程...

节至 1945

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

精雕软件(JDpaint) 5.5 绿色版

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

JVM 的内存区域是如何划分的?

和虚拟机栈作用类似,只是服务对象不同。👉 Java 调用“外援”的专用通道。JVM 靠它知道“下一条指令去哪”例如调用 C / C++ 代码。👉 方法调用的“通话记录”符号引用(类、方法、字段)👉 JVM 的“常量词典”每个方法调用都会创建一个。垃圾回收(GC)的主战场。👉 对象的“集中居住区”记录当前线程正在执行的。👉 JVM 的“书签”👉 类的“说明书仓库”字面量(字符串、数字)逻辑上属于堆的一部分。

2201_75642742的博客 982

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【JVM】谈谈JVM内存区域的划分

对 Java 程序员来说我们不用自己手动管理对象内存的申请与释放,全部交由 Java 虚拟机(JVM)来管理内存的分配与回收。 因此,日常开发中我们不用关心内存分配与回收,减少了很多繁琐的工作,大大提高了开发效率。 也正是因为如此,一旦出内存泄漏和溢出方面的问题,如果不了解 JVM 内部的内存结构、工作机制,那么排查问题将变得异常艰难。 接下来,我们一起学习 JVM 内存区域的划分、作用以及可能产生的问题。 根据 Java 虚拟机规范,Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为几

Geek_ymv的专栏 734

JVM内存区域划分以及GC原理

JVM 是 Java Virtual Machine 的简称,意为 Java虚拟机。虚拟机是指通过软件模拟的具有完整硬件功能的、运⾏在⼀个完全隔离的环境中的完整计算机系统。常见的虚拟机:JVM、VMwave、Virtual Box。JVM 和其他两个虚拟机的区别:1.VMwave与VirtualBox是通过软件模拟物理CPU的指令集,物理系统中会有很多的寄存器;2.JVM则是通过软件模拟Java字节码的指令集,JVM中只是主要保留了PC寄存器,其他的寄存器都进行了裁剪。

2301_79995226的博客 1375

浅谈解析一下怎么去区分JVM 内存区域的划分

本博文将从内存管理的角度,进一步探索 Java 虚拟机(JVM)。垃圾收集机制为我们打理了很多繁琐的工作,大大提高了开发的效率,但是,垃圾收集也不是万能的,懂得 JVM 内部的内存结构、工作机制,是设计高扩展性应用和诊断运行时问题的基础,也是 Java 工程师进阶的必备能力了。

Java_LingFeng的博客 186

【量产】JVM内存区域划分

本次仅讨论JVM内存的自动分配里的部分知识:JVM内存区域的划分

liangcheng0523的博客 1万+
上一篇: go函数使用
下一篇: go语言中的数组与切片
过去日记
过去日记 新星创作者: 后端开发技术领域 新星创作者: 后端开发技术领域
博客等级 码龄3年 5343粉丝 225原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

过去日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值