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
    +关注

    关注

    19

    文章

    2959

    浏览量

    104553
  • 虚拟机
    +关注

    关注

    1

    文章

    908

    浏览量

    28096
收藏 人收藏

    评论

    相关推荐

    从原理聊JVM):染色标记和垃圾回收算法

    导读 JAVA简单易用的特性,能够让研发人员在不了解JVM的底层运行机制的情况下依旧能够编写出功能完善的代码。 但是对JVM的理解,是个程序员普通和优秀的分水岭。全面地了解
    的头像 发表于 08-20 15:25 188次阅读
    从原理聊<b class='flag-5'>JVM</b>(<b class='flag-5'>一</b>):染色标记和垃圾回收算法

    聊聊JVM如何优化

    进行优化。 1.JVM内存模型 针对JAVA8的模型进行讨论,JVM的内存模型主要分为几个关键区域:堆、方法区、程序计数器、虚拟机和本地方法
    的头像 发表于 08-05 17:49 437次阅读
    聊聊<b class='flag-5'>JVM</b>如何优化

    eclipse设置jvm内存大小

    Eclipse是个功能强大的集成开发环境(IDE),常用于Java开发。为了保证Eclipse的性能和稳定性,我们可以根据需要来设置JVM内存大小。本文将详细介绍如何在Eclipse中设置J
    的头像 发表于 12-06 11:43 1827次阅读

    weblogic设置jvm内存大小

    WebLogic是Java EE应用服务器,用于构建和部署企业级Java应用程序。在配置WebLogic服务器时,设置JVM的内存大小非常重要,这可以提高应用程序的性能和可靠性。本
    的头像 发表于 12-05 14:44 2978次阅读

    jvm和jmm的区别

    JVMJava Virtual Machine)和JMM(Java Memory Model)是 Java 开发者非常熟悉的概念。JVM
    的头像 发表于 12-05 14:27 1293次阅读

    jvm配置metaspace最大值的参数

    JVMJava虚拟机)是Java程序的运行环境,而Metaspace是Java 8及其更高版本中引入的种新的内存区域,用于存储类的元数据
    的头像 发表于 12-05 14:21 2017次阅读

    java虚拟机内存包括远空间内存吗

    Java虚拟机(JVM)内存是Java程序执行时所使用的内存空间的总称,包括了Java堆、方法区、本地方法、虚拟机
    的头像 发表于 12-05 14:15 379次阅读

    jvm内存区域中,哪块是属于线程共享

    是如何划分的。JVM内存区域主要分为以下几个部分:程序计数器、Java虚拟机、本地方法、堆、方法区和运行时常量池。其中,程序计数器、Java
    的头像 发表于 12-05 14:14 1326次阅读

    jvm内存区域由哪几部分组成

    JVMJava Virtual Machine)是Java程序运行的环境,在JVM中存在着多个不同功能的内存区域。这些内存区域可以被分为几个部分,包括堆内存、
    的头像 发表于 12-05 14:10 790次阅读

    jvm运行时内存区域划分

    JVMJava Virtual Machine(Java虚拟机)的缩写,它是Java编程语言的运行环境。JVM的主要功能是将
    的头像 发表于 12-05 14:08 506次阅读

    jvm调优工具有哪些

    JVM调优是提高Java应用程序性能的重要手段,而JVM调优工具则是辅助开发人员进行调优工作的利器。下面将介绍些常用的JVM调优工具。 J
    的头像 发表于 12-05 11:44 1032次阅读

    jvm参数的设置和jvm调优

    JVMJava虚拟机)参数的设置和调优对于提高Java应用程序的性能和稳定性非常重要。在本文中,我们将详细介绍JVM参数的设置和调优方法。
    的头像 发表于 12-05 11:36 1437次阅读

    jvm调优参数

    JVMJava虚拟机)是Java程序的运行环境,它负责解释Java字节码并执行相应的指令。为了提高应用程序的性能和稳定性,我们可以调优JVM
    的头像 发表于 12-05 11:29 601次阅读

    jvm内存模型和内存结构

    JVMJava虚拟机)是Java程序的运行平台,它负责将Java程序转换成机器码并在计算机上执行。在JVM中,内存模型和内存结构是两个重要
    的头像 发表于 12-05 11:08 896次阅读

    jvm内存溢出该如何定位解决

    Java应用程序中,JVMJava虚拟机)内存溢出是指Java应用程序试图分配的内存超过了JVM所允许的最大内存大小,导致程序无法正常执
    的头像 发表于 12-05 11:05 1295次阅读