iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java 虚拟机栈详解分析
  • 677
分享到

Java 虚拟机栈详解分析

2024-04-02 19:04:59 677人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

Java虚拟机栈 1. 定义 栈:线程运行时需要的内存空间,一个栈存在多个栈帧。栈具有先入后出,后入先出的特点。 栈帧:每个方法运行时需要的内存(局部变量表、操作数

Java虚拟机

1. 定义

  • 栈:线程运行时需要的内存空间,一个栈存在多个栈帧。栈具有先入后出,后入先出的特点。
  • 栈帧:每个方法运行时需要的内存(局部变量表、操作数栈、动态链接和方法返回值等信息。),每次调用一个方法,便会将栈帧压入栈中,方法执行完毕将栈帧从栈顶压出
  • 活动栈帧:指在栈顶的栈帧,既正在调用的方法,每个线程只能有一个活动栈帧,对应着该线程正在调用的那个方法

现在我们用代码来演示一下Java虚拟机如何将栈帧压入及压出栈中


 public class Main {
     public static void main(String[] args) {
         method1();
     }
     
     private static void method1() {
         method2(1, 2);
     }
     
     private static int method2(int a, int b) {
         int c = a + b;
         return c;
     }
 }

当我们运行Main函数时,JVM首先将栈帧Main压入栈中,此视栈结构如图所示

Main函数体中调用了method1方法,此时便会将栈帧1压入栈中

method1方法体中调用了method2方法,这时jvm会将栈帧2压入栈结构中,需要注意的是,前面我们提到了栈帧由 “局部变量表、操作数栈、动态链接和方法返回值”等信息组成,method2方法中拥有a,b两个参数以及局部变量c和方法返回值

当method2方法执行完后,会将栈帧2从栈顶弹出

method1方法执行完毕后,将栈帧1弹出

依次顺序直至线程被销毁。

注意点

  • 由于每个栈帧都会在方法调用完毕后被弹出,因此栈内存不需要进行垃圾回收
  • 每个栈都是线程私有的,每个线程在创建的时候都会创建一个虚拟机栈,而由于物理内存是固定的,栈内存划分得越大,可分配的线程数就越少

2. 栈的线程安全问题

局部变量是线程安全的

现在我们定义如下方法:


 public static void method() {
     int a = 0;
     a++;
 }

我们在方法method中定义了一个局部变量a,并对其执行a++操作,现在假设我们有两个线程同时调用了这个方法(栈帧),Java虚拟机会将该栈帧压入各自线程的栈内存中,但由于局部变量表是线程私有的,所以两个线程在同时调用这个栈帧后,a的值仍然都为1,故局部变量是线程安全的

方法参数和方法返回值不是线程安全

由于方法的参数和返回值均可被外部方法所引用,故在某个线程下某个方法可以更改另外一个方法的参数和返回值,故方法参数和方法返回值不是线程安全的

3. 栈内存溢出

由于程序执行时,虚拟机给每个栈分配的栈内存空间是固定的,所以在一些情况下有可能出现栈内存空间不足,导致溢出的情况,一般有两种情况可能导致栈内存溢出

  • 栈帧过大(较少出现)
  • 栈帧过多(一般出现在递归时。没有正确设置递归出口)

现在我们来解释一下什么时候会出现栈帧过多导致栈内存溢出,我们来假设某一个栈的内存空间大小是1024kb,现在有四个栈帧,每个栈帧的大小均为300kb,而 300 * 4 = 1200kb, 而 1200 > 1024 ,很显然,现在这四个栈帧合起来的大小已经超过了这个栈的内存空间大小,这个时候就会出现栈内存溢出,也就是会报java.lang.StackOverflowError这个错误。

到此这篇关于Java 虚拟机栈详解分析的文章就介绍到这了,更多相关Java 虚拟机栈内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java 虚拟机栈详解分析

本文链接: https://www.lsjlt.com/news/156689.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java 虚拟机栈详解分析
    Java虚拟机栈 1. 定义 栈:线程运行时需要的内存空间,一个栈存在多个栈帧。栈具有先入后出,后入先出的特点。 栈帧:每个方法运行时需要的内存(局部变量表、操作数...
    99+
    2024-04-02
  • JVM学习- - -虚拟机栈详解
    前言:今天学长带领大家走进JVM学习,让我们一起来学习认识虚拟机栈吧~ 目录 1 虚拟机栈概述 虚拟机栈出现的背景 初步印象 内存中的栈和堆 虚拟机栈基本内容 栈的优点 2 栈的存储单位 栈中存储什么? 栈运行原理 栈帧的内部结构 ...
    99+
    2023-09-12
    jvm 学习 java
  • Java虚拟机栈jvm栈的作用
    目录1. 定义2. 栈的线程安全问题3. 栈内存溢出1. 定义 栈:线程运行时需要的内存空间,一个栈存在多个栈帧。栈具有先入后出,后入先出的特点。 栈帧:每个方法运行时需要的内存(局...
    99+
    2024-04-02
  • Java虚拟机运行时栈的栈帧
    目录Java虚拟机栈概述局部变量表操作数栈动态连接方法的返回地址结合javap命令理解栈帧Java虚拟机栈概述 Java虚拟机栈(Java Virtual Machine Stack...
    99+
    2024-04-02
  • Java虚拟机栈jvm栈有什么用
    小编给大家分享一下Java虚拟机栈jvm栈有什么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1. 定义栈:线程运行时需要的内存空间,一个栈存在多个栈帧。栈具有先入后出,后入先出的特点。栈帧:每个方法运行时需要的内存(局...
    99+
    2023-06-25
  • Java虚拟机内存区域划分详解
    在谈 JVM 内存区域划分之前,我们先来看一下 Java 程序的具体执行过程,我画了一幅图。 Java 源代码文件经过编译器编译后生成字节码文件,然后交给 JVM 的类加载器,加载...
    99+
    2024-04-02
  • java虚拟机指令dup详解
    本文实例为大家介绍了java虚拟机指令dup,供大家参考,具体内容如下举个例子:public class ExceptionTest{ void cantBeZero(int i) throws Exception{ throw n...
    99+
    2023-05-31
    java dup ava
  • Java JVM虚拟机调优详解
    目录jmap查看内存信息jstackjinfo查看jvm系统参数Jstat查看堆内存使用和类加载的数量信息内存泄漏jmap查看内存信息 jmap histo /pid > ./...
    99+
    2024-04-02
  • 深入了解Java虚拟机栈以及内存模型
    目录1、结合字节码指令理解Java虚拟机栈和栈帧2、深入分析2.1 栈指向堆2.2 方法区指向堆2.3 堆指向方法区2.4 Java对象内存布局3、内存模型 3.1 图解3...
    99+
    2024-04-02
  • java虚拟机中栈结构是怎样的
    这篇文章将为大家详细讲解有关java虚拟机中栈结构是怎样的,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. 面向对...
    99+
    2023-06-14
  • java虚拟机之JVM调优详解
    目录JVM常用命令行参数1. 查看参数列表2. 基本参数说明:3. 扩展参数说明:虚拟机参数分类什么是调优1.调优步骤:2.调优案例2.1案例一2.2案例二JVM优化总结JVM常用命...
    99+
    2024-04-02
  • Java栈与队列超详细分析讲解
    目录一、栈(Stack)1、什么是栈?2、栈的常见方法3、自己实现一个栈(底层用一个数组实现)二、队列(Queue)1、什么是队列?2、队列的常见方法3、队列的实现(单链表实现)4、...
    99+
    2024-04-02
  • Vue源码分析之虚拟DOM详解
    为什么需要虚拟dom? 虚拟DOM就是为了解决浏览器性能问题而被设计出来的。例如,若一次操作中有10次更新DOM的动作,虚拟DOM不会立即操作DOM,而是将这10次更新的diff内...
    99+
    2024-04-02
  • Java reservedcodecachesize虚拟机参数案例详解
    一、reservedcodecachesize参数介绍 该参数是JvM虚拟机调优中调整内存大小的一个设置参数,值得大小设置直接影响到Code Cache的大小,而jvm编译的代码有常...
    99+
    2024-04-02
  • Java虚拟机之双亲委派机制详解
    目录一、原理二、作用三、沙箱安全机制四、补充内容总结Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象...
    99+
    2024-04-02
  • Java虚拟机发展变化的示例分析
    这篇文章将为大家详细讲解有关Java虚拟机发展变化的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. 面向...
    99+
    2023-06-14
  • java内存模型jvm虚拟机简要分析
    目录主内存和工作内存内存间的交互操作原子性、可见性、有序性原子性可见性有序性主内存和工作内存 Java 内存模型规定了所有的变量都存储在主内存中, 每条线程有自己的工作内存...
    99+
    2024-04-02
  • Java虚拟机之类加载的示例分析
    小编给大家分享一下Java虚拟机之类加载的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序...
    99+
    2023-06-15
  • 如何解析Java虚拟机的Class文件
    这篇文章给大家介绍如何解析Java虚拟机的Class文件,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。前面发了几篇学习笔记,但是看这些东西总是感觉很"玄乎",来一篇实战的东西来揭一下"JV...
    99+
    2023-06-17
  • java虚拟机中栈的运行知识点总结
    运行原理 1、不同线程中所包含的栈帧是不允许存在相互引用的。 2、如果当前方法调用了其他方法,方法返回之际,当前栈帧会传回此方法的执行结果给当前一个栈针,并且虚拟机会丢弃当前栈帧,使...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作