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

    文章

    2917

    浏览量

    103363
  • 虚拟机
    +关注

    关注

    1

    文章

    870

    浏览量

    27578
收藏 人收藏

    评论

    相关推荐

    eclipse设置jvm内存大小

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

    weblogic设置jvm内存大小

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

    jvm和jmm的区别

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

    jvm配置metaspace最大值的参数

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

    jvm配置堆内存初始值参数

    JVMJava Virtual Machine)是Java语言的运行环境,它通过解释字节码并执行相应的指令来运行Java程序。在JVM中,
    的头像 发表于 12-05 14:17 452次阅读

    jvm运行时内存区域划分

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

    jvm调优工具有哪些

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

    jvm参数的设置和jvm调优

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

    jvm调优参数

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

    jvm内存模型和内存结构

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

    jvm内存分析命令和工具

    JVM内存分析是Java开发和调优过程中非常重要的一部分。通过对JVM内存分析命令和工具的深入了解和使用,可以帮助开发人员识别内存泄漏、性能瓶颈等问题,并对Java应用进行优化。 下面
    的头像 发表于 12-05 11:07 662次阅读

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

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

    JVM指针压缩的工作原理

    当今,Java已经成为了世界上最流行的编程语言之一。在Java的生态系统中,JVMJava虚拟机)是至关重要的组成部分。JVM
    的头像 发表于 10-16 15:08 440次阅读
    <b class='flag-5'>JVM</b>指针压缩的工作原理

    JVM知识体系剖析

    从源码到运行、类加载,再到内存分配和垃圾回收,以及JVM调优的技巧与实战。 理论-实战-面试三结合,带大家剖析整个JVM知识体系,一站解决JVM问题。 1、Oracle
    的头像 发表于 10-10 11:37 303次阅读
    <b class='flag-5'>JVM</b><b class='flag-5'>知识</b>体系剖析

    详解Java虚拟机的JVM内存布局

    JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的稳定高效运行。不同的JVM对于内存的划分方式和管理机制存在部分差异。结合
    的头像 发表于 07-13 09:52 366次阅读
    详解<b class='flag-5'>Java</b>虚拟机的<b class='flag-5'>JVM</b>内存布局