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

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

    资源描述: 1.JVM中[虚拟机栈]的所有内容-pdf 2.资源内容:JVM中[虚拟机栈]所有内容 3.学习目标:了解jvm底层原理 4.特点:简单易懂,容易上手 5.使用说明:需要使用pdf打开

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

    Java虚拟机栈也是线程私有的,它的生命周期与线程...(当前大部分JVM都可以动态扩展,只不过JVM规范也允许固定长度的虚拟机栈) 3. Java虚拟机栈描述的是Java方法执行的内存模型:每个方法执行的同时会创建一个栈帧。

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

    主要介绍了jvm虚拟机栈的作用,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

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

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

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

    虚拟机栈,本身就是一个普通的栈,栈中的元素叫做栈帧。 虚拟机栈是线程私有的,每有一个线程,虚拟机就会创建一个虚拟机栈,线程与虚拟机栈一一对应。线程每调用一个方法,虚拟机就会创建一个栈帧,并将此栈帧压入...

    虚拟机栈.xmind

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

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

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

    05 虚拟机栈.pptx

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

    05_虚拟机栈.pptx

    虚拟机栈

    一次性精通JVM JAVA虚拟机

    为什么要学JVM 1、一切JAVA代码都运行在JVM之上,只有深入理解虚拟机才能写出更强大的代码,解决更深...第4章 内存模型,本章节涵盖JVM内存模型的全部内容,程序计数器、虚拟机栈、本地方法栈、方法区、永久代、元空间

    JVM虚拟机内容导图.xmind

    JVM虚拟机各知识点总结整理, 包括java虚拟机概念、堆、栈、方法区、垃圾回收概念、算法及分代转换、垃圾收集器参数配置、算法实现等各方面内容,每个点都有详细的备注描述介绍

    精简版JVM总结.pdf

    JVM 内存区域 线程私有 程序计数器 当前线程所执行的字节码的行号指示器 对于 Java 方法,记录正在执行的虚拟机字节码指令的地址;...与虚拟机栈类似,区别在于虚拟机栈执行Java方法,本地方法栈执行 Native 方法

    jvm指令手册 +JVM必知必会,掌握虚拟机编译过程.rar

    JVM指令主要分为:本地变量表到操作数栈类指令、操作数栈到本地变量表类指令、常数到操作数栈类指令、将数组指定索引的数组推送至操作数栈类指令、将操作数栈数存储到数组指定索引类指令、操作数栈其他相关类指令、...

    JVM教程吐血整理干货.md

    Java虚拟机栈 栈帧 局部变量表 操作数栈 动态连接 方法出口 本地方法栈 堆 方法区 JavaVirtualMachineError StackOverflowError OutOfMemoryError JVM PS:JVM部分参考了《深入理解Java虚拟机 - 第二版》(周志明). ...

    深入了解 JVM 虚拟机(超详细入门攻略)

    JVM虚拟机的详细介绍1. 内存模型以及分区2. 堆里面的分区:Eden,survival (from+ to),老年代,各自的特点。3. GC 的两种判定方法4. SafePoint 是什么5. GC 的三种收集方法的优缺点6. JVM 内存分哪几个区,每个区...

    Java虚拟机(JVM)面试题(总结最全面的面试题!!!)

    (重点理解)详细介绍下Java虚拟机栈?(重点理解)一个方法调用另一个方法,会创建很多栈帧吗?栈指向堆是什么意思?递归的调用自己会创建很多栈帧吗?你能给我详细的介绍Java堆吗?(重点理解)能不能解释一下本地...

    深入Java虚拟机(原书第2版).pdf【附光盘内容】

     本书共分20章,第1-4章解释了java虚拟机的体系结构,包括java栈、堆、方法区、执行引擎等;第5-20章深入描述了java技术的内部细节,包括垃圾收集、java安全模型、java的连接模型和动态扩展机制、class文件、运算及...

    java虚拟机JVM详解ppt

    详细介绍了java虚拟机和java内存区域的描述解释,并针对堆和栈的内存溢出进行了案例描述,是不可多得的分享资料

    JAVA虚拟机.ppt

    定义 简介 特点 使用主题 安装方法 支持的数据类型 ... JVM栈结构 JVM碎片回收堆 体系结构 8.1Java指令集 8.2寄存器 8.3栈 8.4单位收集堆 8.5方法区 JVM的运行过程 Java虚拟机命令行参数说明 JVM存储区

Global site tag (gtag.js) - Google Analytics