java虚拟机栈(关于java虚拟机内存的那些事)

《深入理解 java 虚拟机》 读书扩展

 作者:淮左白衣

 写于 2018年4月13日16:26:51	

目录


java虚拟机栈是什么

平时大家在说 JVM内存 的时候,最常见的说法就是:堆、栈,这种说法很浅显,这里大家理解的栈,就是我们今天讲的java虚拟机栈,或者可能只是虚拟机栈中的 局部变量表 部分;


特点

  1. 线程私有的
  2. 生命周期与线程一致
  3. 每个方法执行的同时,都会在java虚拟机栈中创建一个 栈帧
  4. 会抛出 StackOverflowErrorOutOfMemoryError 异常

栈帧

,每个方法在执行的时候,在内存中的模型就是创建一个栈帧,栈帧是方法运行时的基本数据结构可以理解为栈帧是当前正在运行时的方法的对象;栈帧中存储着方法运行时需要的一些信息:局部变量表、操作数栈、动态链接、方法出口等信息;

(我们后期再去着重理解栈帧,现在只需要知道一些基本概念就好了)

常说入栈出栈,就是栈帧的入栈出栈;


局部变量表

局部变量表中,保存着方法中用到的局部变量(基本数据类型,引用类型)
局部变量表,所占的内存空间在 编译期间 就确定下来了,也就是当方法入栈的时候,栈帧中为方法的局部变量表分配多大空间是完全确定的;你可能会问,假如我程序中有if-else块,那么if块和else块中的变量,会全部算进局部变量表里面吗;答案是肯定的,分支结构中的变量,都会被算进去;
其中long和double占两个局部变量空间(slot),其他类型占用一个slot;因此,我们写的方法,如果方法中的局部变量太多,会占用更大的虚拟机栈空间;


什么时候抛出 StackOverflowErrorOutOfMemoryError 异常

StackOverflowError :当线程申请的栈深度大于虚拟机允许的深度,抛出StackOverflowError 异常;

OutOfMemoryError :假如线程申请的栈深度已经大于虚拟机所允许的深度了,但是虚拟机支持动态扩展 栈的深度,则进行扩展栈的深度,而不是抛 StackOverflowError 异常;最后,假如虚拟机无法获得足够的内存进行栈深度的扩展,则抛出 OutOfMemoryError 异常 ;


后记:本地方法栈

在JVM的内存中,还有一个本地方法栈,它和虚拟机栈的功能基本一样,只是它里面的栈帧,是本地方法对象;它同样抛出 StackOverflowErrorOutOfMemoryError 这两个异常,没啥好说的;

原文地址:https://www.cnblogs.com/young-youth/p/11665735.html