`
youyu4
  • 浏览: 440288 次
社区版块
存档分类
最新评论

JVM之虚拟机栈

 
阅读更多

JVM之虚拟机栈

 

       每个线程有一个私有栈,随着线程的创建而创建。栈里面有栈桢,每个方法创建一个栈桢,方法的调用是入栈的过程,方法调用完返回就是出栈的过程。栈的大小可以动态扩展,当栈的调用深度大于JVM所允许的范围,会抛出StackOverflowError。

 

 

 

java栈的组成元素-------栈桢

 

       栈帧由三部分组成:局部变量区、操作数栈、帧数据区。局部变量区和操作数栈的大小要视对应的方法而定,他们是按字长计算的。但调用一个方法时,它从类型信息中得到此方法局部变量区和操作数栈大小,并据此分配栈内存,然后压入Java栈。

 

栈桢的特点

 

  • 每个方法从调用开始到执行完成的过程,对应一个栈桢在虚拟机栈中,从入栈到出栈的过程。
  • 活动线程中,只有栈顶的栈桢是有效的,称为当前栈桢,这个栈桢关联的方法叫当前方法。

 

 

局部变量表

 

主要作用:存放方法参数和方法内的局部变量

 

局部变量表被组织为以一个字长为单位、从0开始计数的数组,类型为short、byte和char的值在存入数组前要被转换成int值,而long和double在数组中占据连续的两项,在访问局部变量中的long或double时,只需取出连续两项的第一项的索引值即可,如某个long值在局部变量区中占据的索引时3、4项,取值时,指令只需取索引为3的long值即可。



 

 

 

操作数栈

 

主要作用:数据计算时,临时数据的存储存储区域,通过入栈和出栈来存储数据

 

和局部变量区一样,操作数栈也被组织成一个以字长为单位的数组。但和前者不同的是,它不是通过索引来访问的,而是通过入栈和出栈来访问的。可把操作数栈理解为存储计算时,临时数据的存储区域。

 



 

 

 

桢数据区

 

主要作用:访问常量池中的数据、正常方法返回、异常派发机制

 

 

访问常量池数据

       当JVM执行到需要常量池数据的指令时,它都会通过帧数据区中指向常量池的指针来访问它。

 

 

正常方法返回

       如果是通过return正常结束,则当前栈帧从Java栈中弹出,恢复发起调用的方法的栈。如果方法有返回值,JVM会把返回值压入到发起调用方法的操作数栈。

 

 

异常机制

       当异常抛出时,JVM给catch块中的代码。如果没发现,方法立即终止,然后JVM用帧区数据的信息回复发起调用的方法的帧。然后再发起调用方法的上下文重新抛出同样的异常。

 

 

 

栈的运行过程

 

代码

 

class Example3C{
    public static void addAndPrint(){
        // addAndPrint中调用了addTwoTypes
        double result = addTwoTypes(1,88.88);
        System.out.println(result);
    }
    public static double addTwoTypes(int i, double d){
    return i+d;
    }

}

 

 

执行过程的三个快照



 

上图说明了两件事

  1. 只有在调用一个方法时,才为当前栈分配一个帧,然后将该帧压入栈
  2. 帧中存储了对应方法的局部数据,方法执行完,对应的帧则从栈中弹出,并把返回结果存储在调用 方法的帧的操作数栈中

 

 

JVM配置

 

-Xss128K,每个线程栈的大小为128K,如果不设置,JDK5.0以后用默认值1M,之前默认值是256K。

 

在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一 个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。

 

栈空间调忧要注意

 

线程栈的大小是个双刃剑,如果设置过小,可能会出现栈溢出,特别是在该线程内有递归、大的循环时出现溢出的可能性更大,如果该值设置过大,就有影响到创建栈的数量,如果是多线程的应用,就会出现内存溢出的错误。

 

JVM可创建的最大线程数限制因素

线程堆栈大小——》进程的最大内存——》操作系统位数

 

 

面试题

 

1. 栈桢由那三部分组成,各自存储了什么数据?

 

2. 操作指令在栈桢中是如何工作的?

 

3. 如果发生零除异常,它是如何被抛出的?

  • 大小: 7.6 KB
  • 大小: 35 KB
  • 大小: 42 KB
分享到:
评论

相关推荐

    JVM中[虚拟机栈]的所有内容-pdf

    Java虚拟机栈(JVM Stack)是Java虚拟机内存模型中的一个重要组成部分,它与程序的执行密切相关。每个线程在启动时都会创建一个独立的虚拟机栈,用于存储每个线程在执行过程中产生的栈帧(Stack Frame)。栈帧是...

    详解java中jvm虚拟机栈的作用

    详解 Java 中 JVM 虚拟机栈的作用 JVM 虚拟机栈是 Java 虚拟机(JVM)中的一部分,负责管理 Java 程序的执行。虚拟机栈由一个个栈帧组成,每个栈帧包含局部变量表、操作数栈、动态连接和方法出口四部分。 局部变量...

    深入理解JVM-java虚拟机栈.docx

    Java虚拟机栈(JVM Stack)是Java虚拟机的核心组件之一,它负责管理方法执行时的内存模型。栈是线程私有的,每个线程在启动时都会创建一个虚拟机栈,栈的生命周期与线程同步,即随线程创建而创建,随线程结束而销毁...

    JVM内存结构-JVM体系结构 程序计数器 虚拟机栈 本地方法栈 堆 方法区

    JVM内存结构-JVM体系结构 程序计数器 虚拟机栈 本地方法栈 堆 方法区

    5 运行时数据区之虚拟机栈.md,学习代码i

    虚拟机栈,又称为线程栈,每个Java线程都会有一个与之对应的虚拟机栈。每当线程启动时,这个栈就会被创建。栈的主要任务是存储方法调用过程中的局部变量表、操作数栈、动态链接和方法出口等信息。这些信息是Java方法...

    jvm8虚拟机规范

    《JVM8虚拟机规范》深入解析 Java虚拟机(JVM)是Java程序的核心运行环境,它负责解析和执行Java字节码,为开发者提供了跨平台的运行支持。JVM8是Java 8版本的虚拟机规范,包含了对内存布局、数据类型、类文件格式...

    深入理解jvm虚拟机

    标题提到的“深入理解JVM虚拟机”,意味着要对JVM的内部机制进行深入的研究和理解。其核心知识点涵盖了如下几个方面: 1. JVM架构组成:JVM主要由类加载器(Class Loader)、运行时数据区(Runtime Data Area)、...

    Java(JVM)虚拟机结构基础

    Java虚拟机(JVM)是Java技术的核心组件之一,它负责执行Java字节码,确保跨平台的兼容性。深入理解JVM的结构与工作原理对于优化Java应用、提升编程技能具有重要意义。 #### JVM的结构概览 JVM主要由以下几部分...

    【JVM】虚拟机栈的五脏六腑

    【JVM】虚拟机栈是Java程序执行过程中的重要组成部分,它主要负责管理方法的调用和执行。每个线程都有自己的虚拟机栈,每当线程执行一个方法时,都会在虚拟机栈中创建一个栈帧,这个栈帧是存储方法执行状态的数据...

    JVM_01 内存结构(程序计数器、虚拟机栈、本地方法栈)

    ### JVM_01 内存结构详解:程序计数器、虚拟机栈、本地方法栈 #### 一、JVM入门介绍 ##### JVM定义 Java Virtual Machine (JVM) 是 Java 程序的运行环境,它负责执行 Java 字节码(即编译后的 `.class` 文件)。...

    虚拟机栈.xmind

    自己总结的jvm中虚拟机栈的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合jvm的爱好者和学习者

    JVM虚拟机深度讲解

    《JVM虚拟机深度讲解》这本书是JAVA开发者深入理解JVM的重要参考资料,它全面而详尽地探讨了Java虚拟机的工作原理与优化技巧。通过阅读本书,开发者可以大幅提升对JVM的理解,从而在编程实践中更好地驾驭这个强大的...

    JVM.rar_jvm_虚拟机

    JVM虚拟机指令集是Java字节码的基石,它由一系列低级、简单的操作码组成,这些操作码负责执行基本的计算和控制任务。每条指令通常对应一个字节,并且有特定的含义和作用。例如: 1. **加载和存储指令**:如`iload`...

    java虚拟机

    7. **异常处理与线程**:JVM支持多线程,每个线程有自己的虚拟机栈和程序计数器。异常处理机制通过try-catch-finally语句块来捕获和处理程序中的异常。 8. **编译与即时编译(JIT,Just-In-Time)**:JVM有两种方式...

    Java(JVM)虚拟机结构基础(转自Java研究组织)

    JVM采用栈式架构,其中虚拟机栈和本地方法栈用于存储线程的局部变量和操作数。每当执行一个方法时,JVM会创建一个新的栈帧,当方法执行完毕,该栈帧会被销毁。 #### 内存管理与垃圾回收 JVM的内存管理主要包括对象...

    java-jvm虚拟机原理.ppt

    Java虚拟机(JVM)是Java程序运行的核心组件,它为Java代码提供了平台无关的运行环境。本篇文章将深入探讨JVM的生命周期、体系结构、类加载机制、内存区域以及垃圾收集。 首先,JVM的生命周期与Java程序紧密关联。...

    02.Java虚拟机栈1

    Java虚拟机栈是Java虚拟机(JVM)的重要组成部分,它是每个线程私有的内存区域。在Java程序执行过程中,每当一个方法被调用时,都会在虚拟机栈中创建一个对应的栈帧,用于存储局部变量、操作数、动态链接、方法出口...

    JAVA虚拟机(JVM)规范(中文版).rar

    3. **虚拟机栈**:每个线程都有自己的虚拟机栈,用于存储局部变量、操作数栈、动态链接和方法出口信息。 4. **本地方法栈**:为JNI方法服务,存储本地方法的局部变量。 5. **程序计数器**:记录当前线程执行的字节码...

    05 虚拟机栈.pptx

    本文记录 2020 JVM 第 5 章 虚拟机栈相关知识,包括虚拟机栈的基本知识,栈的内部结构等。 该 PPT 为重绘版本。

Global site tag (gtag.js) - Google Analytics