Java堆栈叫法专坑新人!堆和栈的区别,一个存储对象一个记方法调用,整不明白就别写代码了
有点明白堆是heap, 栈是stack, 而堆栈实际上是栈。嗯呐, 我是真的特别不喜欢“堆栈”这种称谓, 它很容易致使新人掉进坑里。JVM的规范使得每个Java线程享有自身独立的JVM栈, 这就是Java方法的调用栈。与此同时, JVM规范为了能够让代码去调用Java代码, 并且还能让Java代码调用方法, 于是规定每个Java线程都有自己独立的方法栈。这俩均是JVM规范所规定的概念范畴内的事物, 并非是讲具体的JVM实现切实要为每个Java线程开辟两个独立的栈。拿JDK / 的VM来说, 它运用所谓的“mixed stack”, 即于同一个调用栈里放置Java方法的栈帧以及方法的栈帧, 故而每个Java线程实际上仅有一个调用栈, 此调用栈融合了JVM规范的JVM栈与方法栈这两个概念。JVM里叫做“堆”heap的部分专门用来存放Java对象的内存区域。所以依据这个定义, Java对象全都处于堆上。需留意, 此“堆”并非数据结构层面的那个堆Heap (data ), 一种有序的树, 而是动态内存分配意义范畴的堆——用以管理动态生存期的内存区域。JVM的堆被同一个JVM实例里的所有Java线程共同分享。它通常由某种自动内存管理机制进行管理 , 这种机制通常称作“垃圾回收” , GC。JVM规范并不硬性规定JVM实现采用何种GC算法。把堆同栈区分开来, 依据其对应功能, 栈内存肩负起存储局部变量以及方法调用的职责, 不过堆内存充当起存储Java里对象的场所, 各类变量, 像是成员变量, 局部变量, 或者类变量, 它们所指向的对象统统存储于堆内存区域内。以共享性为着眼点, 栈内存具备线程私有的特性, 堆内存则是所有线程都可共有的。当涉及异常错误方面, 一旦栈内存或者堆内存出现不足的状况, 就会抛出异常, 具体而言, 栈空间不足时会出现java.lang., 堆空间不足时会出现java.lang.。就空间大小而言, 栈的空间大小相较于堆的要小很多。深入理解栈, 栈帧由三部分构成, 分别是局部变量区、操作数栈、帧数据区, 局部变量区和操作数栈大小依对应的方法而定, 它们按字长计算, 调用一个方法时, 它从类型信息里获取此方法局部变量区和操作数栈大小, 依据此来分配栈内存, 随后压入Java栈。局部变量区, 它被组织成以一个字长作为单位, 且从0开始计数的数组, 其中类型为short、byte以及char的值, 如果要存入数组的话, 在存入前提要被转换成int值并且long和在这部数组中占据连续的两项, 如果说在访问局部变量中的long或的时候, 仅仅只需取出连续两项的第一项的索引值就行啦, 就好像某个long值在局部变量区中等所在的索引是这三项, 第一项是比如说是3, 它的第二项是index对应的4那样, 取值时刻, 指令仅仅只需取索引为3的long值就可以的。像是这样的代码以及图所展示的: int (int i,long l,float f, d, o,byte b) { 0;} int (char c, d,short s, b) { 0;}!()### 操作数栈, 它跟局部变量区是一样的情况, 操作数栈同样被构建成一个以字长作为单位的数组, 然而和前者存在差异的是, 它并非借助索引来进行访问, 而是依靠入栈以及出栈这种方式来实现访问的, 能够将操作数栈理解成在存储计算的时候, 用于临时数据的一个存储区域。紧接着, 借助一段简短的程序片段, 再搭配一幅图片, 以此来弄明白操作数栈所具备的作用。 int a 100; int b 98; int c ab; !()由图能够推断出: 操作数栈实际上就是一个临时的数据存储区域, 它依靠入栈以及出栈的方式来开展操作。### 帧数据区 在局部变量区以及操作数栈之外, java栈帧还需要一些数据去支撑常量池解析、正常方法返回以及异常派发机制。那些数据全都被保存在java栈帧的帧数据区之内。当JVM执行至需要常量池数据的指令之际, 它都会借助帧数据区中指向常量池的指针去访问它。 除了对常量池解析进行处理之外, 帧里的数据还要处理java方法的正常结束以及异常终止。要是通过正常结束, 那么当前栈帧会从Java栈中弹出, 恢复发起调用的方法的栈。要是方法存在返回值, JVM会将返回值压入到发起调用方法的操作数栈。帧数据区得保存一个针对此方法异常引用表的引用, 这是为了去处理java方法里的异常状况。当异常被抛出时, JVM会把代码给予catch块中的代码。要是没找到, 方法会马上去终止, 接着JVM会利用帧区数据的信息, 去恢复发起调用的方法的帧。之后在发起调用方法的上下文里, 再次抛出同样的异常。### 栈的整个结构, 栈是由栈帧构成的, 每当线程调用一个java方法之际, JVM会在该线程对应的栈当中压入一个帧, 然而帧是由局部变量区、操作数栈以及帧数据区组成的。那在一个代码块中栈到底是什么形式呢下面是《深入JVM》里的一个例子: class Main{void (){(1,88.88);.out.();}(int i, d){i d;}}执行进程里的三个快照: !()上面这幅图表明两件事儿: 1、唯有在调用某一个方法之际, 才会为当前的栈分配一个帧, 接着把这个帧压进栈2、帧当中存放着对应方法的局部数据, 当方法执行完毕后, 对应的帧便从栈当中弹出, 并且将返回结果存储在调用该方法的帧的操作数栈当中。按照操作系统里进程的内存结构来阐释, 下图描绘的是linux里一个进程的虚拟内存分布情况, 图中0号地址处于最下方, 越往上方内存地址便越大, 以32位地址的操作系统而言, 一个进程所能拥有的虚拟内存地址范围是0到2的32次方, 可划分为两部分, 一部分被用于其他用途, 剩余的则供进程自身使用, 也就是图中的部分, 普通Java程序所使用的正是这部分。

相关新闻

202、【Agent】【OpenCode】JS 语法:闭包捕获还是参数传递

202、【Agent】【OpenCode】JS 语法:闭包捕获还是参数传递

【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除 标题 202、【Agent】【OpenCode】JS 语法&…

2026/10/24 7:11:44 阅读更多 →
STC12C5A60S2 与 ESP8266 联动开发学习记录

STC12C5A60S2 与 ESP8266 联动开发学习记录

0. 前言最近在做一个基于 STC12 单片机的小项目,需要把传感器数据通过 Wi-Fi 发送到上位机。我选择了最常见的 ESP8266 模块作为无线通信方案。考虑到现场没有路由器,而且只需要一对一数据传输,我决定把 ESP8266 配置成 AP 模式 TCP Server&…

2026/11/13 19:45:38 阅读更多 →
TVA具身架构范式创新:破解意图理解与行为预测难题

TVA具身架构范式创新:破解意图理解与行为预测难题

前沿技术探索:TVA智能体(简称TVA)TVA智能体(亦称“AI智能体视觉”或“TVA视觉智能体”)是依托Transformer架构与“因式智能体”理论构建的通用视觉技术体系。它有机融合深度强化学习(DRL)、卷积…

2026/10/23 13:48:03 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/15 5:13:35 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/15 5:13:35 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/15 5:13:35 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/15 3:37:41 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/15 4:18:38 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/15 5:13:35 阅读更多 →

日新闻

周新闻

月新闻