0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

JVM进阶知识(一):初识 JAVA 栈

深入浅出 JVM 来源:深入浅出 JVM 作者:深入浅出 JVM 2022-03-01 14:02 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、前言

若想自己编写的Java程序高效运行,以及进行正确、高效的异常诊断,JVM是不得不谈的一个话题。本”JVM进阶“专栏大部分内容均来源于经典书籍《深入理解Java虚拟机》。

二、栈存储

言归正传,本文重点从虚拟机内存模型(运行时数据区域)入手。先看下图:

这里写图片描述

这是一张比较官方的虚拟机模型图,今天讲的就是虚线框中栈的部分。

栈是我们最常用的内存区域。它主要用来存放基本类型变量,局部变量以及对象的引用。例如:User user = new User();这里的user就是对象的引用也可以理解为地址,指引着虚拟机要去哪里找user这个对象。 他们的基本关系如图:

这里写图片描述

由上图可知,当我们将一个对象作为方法的参数时,我们在方法中改变对象的值,也会影响到原来对象的值,因为我们只是改变了图中内存区域的值,他的指引(地址)还是一样的。同时也可以看出,栈的内存区域是连续的,有大小限制的,如果超过了就会抛出栈溢出的异常StackOverflowError。

在每个方法执行的时候,都会创建一个个的栈帧,用于保存局部变量表,操作数栈,动态链接等信息(以后都会详细讲解)。每次方法的调用都会对应着一个栈帧,因此可以解释当我们在写递归程序的时候会不小心报栈溢出的异常,因为栈是有限的,方法调用太多次导致栈帧堆满了栈,所以溢出。看下面代码:

public class Test {
private static int stackLength = 0;
private static void main(String[] args) {
 try {
  Test test = new Test();
  test.stackOverFlow();
 } catch (Throwable e) {
  System.out.println("stackLength:" + stackLength);
  throw e;
 }
}
public void stackOverFlow() {
 // 疯狂递归调用
 stackLength++;
 stackOverFlow();
}
}


在参数-Xss128k的情况下的报错。(eclipse中设置参数:右键代码选择Run As-->Run Configurations,在Arguments栏下的VM arguments中填入参数,再Apply,再run)

这里写图片描述

每次在方法执行完毕的时候,虚拟机会自动释放掉为该栈所分配的空间,在栈中,对应着一个栈帧的出栈。虚拟机会自动分配与回收内存,因此效率比较高。

三、总结

最后做一下栈的总结:

存放基本类型变量,局部变量,对象的引用;
系统自动分配与回收内存,效率较高,快速,存取速度比堆要快;
是一块连续的内存的区域,有大小限制,如果超过了就会栈溢出,并抛出栈溢出的异常StackOverflowError;
Java会自动释放掉为该变量所分配的内存空间;
栈又分为java栈和本地方法栈。顾名思义,本地方法栈自然就是为本地方法提供服务的,java栈是为java服务的。

注意⚠️:JVM栈是每个线程私有的!

四、拓展阅读

《JVM虚拟机专栏》

审核编辑:符乾江

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    20

    文章

    3006

    浏览量

    116828
  • 虚拟机
    +关注

    关注

    1

    文章

    975

    浏览量

    30693
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    人工智能-Python深度学习进阶与应用技术:工程师高培解读

    深度学习的工程化落地,早已不是纸上谈兵的事。从卷积神经网络到Transformer,从目标检测到大模型私有化部署,技术不断延伸,工程师面临的知识体系也越来越庞杂。现根据中际赛威工程师培训老师的
    的头像 发表于 04-21 11:01 289次阅读
    人工智能-Python深度学习<b class='flag-5'>进阶</b>与应用技术:工程师高培解读

    Java并发编程的“基石”——多线程概念初识

    领域里,Java 正凭借其深厚的并发底层基石,悄然成为支撑未来算力调度的隐形王者。(搜星 课it。top) 、 算力调度的本质:场极端的“资源争夺战” AI 时代的算力调度,与传统互联网时代
    发表于 04-16 18:50

    软通动力以全智能重塑中国科技企业全球化竞争新优势

    1月6日至9日,在CES 2026全球科技盛会期间,软通动力国际业务总裁黄立接受钛媒体创始人赵何娟的独家专访。双方围绕中国科技企业的全球化进阶路径、全智能战略布局以及如何在复杂的国际环境中实现
    的头像 发表于 01-14 15:10 582次阅读

    第8章 函数进阶与按键(8.1 8.2)

    函数的进阶知识。 8.1 单片机最小系统解析 8.1.1 电源 学习过程中,很多指标都是直接用的概念指标,比如说+5V代表1,GND代表0等等。但在实际电路中的电压值并不是完全精准的,那这些指标允许范围是什么呢?随着学习的内
    的头像 发表于 12-18 11:27 427次阅读
    第8章 函数<b class='flag-5'>进阶</b>与按键(8.1 8.2)

    ETAS INCA软件的五个实用进阶功能

    在上篇文章中我们介绍了INCA软件如何赋能高效的ECU开发及新能源挑战,本篇内容将继续深入探讨INCA的五个实用进阶功能。
    的头像 发表于 12-08 16:42 2684次阅读
    ETAS INCA软件的五个实用<b class='flag-5'>进阶</b>功能

    Stack到底用来干嘛的呢?

    我们在函数的局部变量、数组这些不能超过1K(含嵌套的函数),否则程序就会崩溃进入hardfaul。 除了这些局部变量以外,还有些实时操作系统的现场保护、返回地址都是存储在里面。 还有点题外话,就是
    发表于 12-01 08:04

    Arm Neoverse CPU上大代码量Java应用的性能测试

    Java 是互联网领域广泛使用的编程语言。Java 应用的些特性使其性能表现与提前编译的原生应用(例如 C 程序)大相径庭。由于 Java 字节码无法直接在 CPU 上执行,因此通常
    的头像 发表于 11-05 11:25 934次阅读
    Arm Neoverse CPU上大代码量<b class='flag-5'>Java</b>应用的性能测试

    Java效率提升指南:5个Java工具选型建议及Perforce JRebel和XRebel介绍

    企业级Java环境越来越复杂,真正的破局点,可能不在“人”,而在于“工具”。5个实用建议,帮你理清Java工具的选型思路。
    的头像 发表于 09-11 13:59 1887次阅读
    <b class='flag-5'>Java</b>效率提升指南:5个<b class='flag-5'>Java</b>工具选型建议及Perforce JRebel和XRebel介绍

    自动驾驶中常提的“全”是个啥?有必要“全”吗?

    和应用,涵盖从底层硬件、感知算法、高精地图、定位与融合,到决策规划、控制执行、软件平台,乃至整车集成与云端服务的完整链条。对于希望在激烈的市场竞争中占据席之地的车企和科技公司来说,全似乎代表了掌握核心竞争
    的头像 发表于 08-27 09:43 1399次阅读
    自动驾驶中常提的“全<b class='flag-5'>栈</b>”是个啥?有必要“全<b class='flag-5'>栈</b>”吗?

    Java开发必备】IntelliJ IDEA数据库功能进阶指南:9个JetBrains工程师私藏技巧

    想提升涉及数据库的Java开发效率?IntelliJ IDEA为您带来了9大进阶招式!无论您是刚刚启动新项目,还是正在深入优化现有系统,这些实用技巧都将助您事半功倍。
    的头像 发表于 05-21 17:04 885次阅读
    【<b class='flag-5'>Java</b>开发必备】IntelliJ IDEA数据库功能<b class='flag-5'>进阶</b>指南:9个JetBrains工程师私藏技巧

    RK3568驱动指南|驱动基础进阶篇-进阶7 向系统中添加个系统调用

    RK3568驱动指南|驱动基础进阶篇-进阶7 向系统中添加个系统调用
    的头像 发表于 05-21 14:15 826次阅读
    RK3568驱动指南|驱动基础<b class='flag-5'>进阶</b>篇-<b class='flag-5'>进阶</b>7 向系统中添加<b class='flag-5'>一</b>个系统调用

    开发进阶指南:LuatOS-log库从入门到实战!

    本文将带你深入探索LuatOS系统中log库的核心原理与实战技巧,通过代码示例解析日志管理、错误追踪及性能优化的最佳实践,助力全工程师构建更稳健的物联网应用。 今天,我们起来认识LuatOS
    的头像 发表于 05-15 16:12 3006次阅读
    全<b class='flag-5'>栈</b>开发<b class='flag-5'>进阶</b>指南:LuatOS-log库从入门到实战!

    Altium Designer PCB设计高级进阶

    对PCB设计的高级进阶的内容进行相关的介绍 纯分享贴,有需要可以直接下载附件获取完整资料! (如果内容有帮助可以关注、点赞、评论支持下哦~)
    发表于 04-27 16:40

    Java开发者必备的效率工具——Perforce JRebel是什么?为什么很多Java开发者在用?

    Perforce JRebel是Java开发效率工具,旨在帮助java开发人员更快地编写更好的应用程序。JRebel可即时重新加载对代码的修改,无需重启或重新部署应用程序,就能让开发者即时看到代码更改的效果,从而缩短开发、调
    的头像 发表于 04-27 13:44 973次阅读
    <b class='flag-5'>Java</b>开发者必备的效率工具——Perforce JRebel是什么?为什么很多<b class='flag-5'>Java</b>开发者在用?

    Java 到 Go:面向对象的巨人与云原生的轻骑兵

    (Goroutine/Channel) 在 云原生基础设施领域 占据主导地位,它也是 Java 开发者探索云原生技术的关键补
    的头像 发表于 04-25 11:13 746次阅读