1 栈的概念和定义

栈是一种可以被用来快速访问的存储区域。该区域位于通用RAM里面。

  • 缺点:java编译器必须知道被存储在栈内的所有数据的确切大小和生命周期。
  • 优点:速度快,仅次于寄存器,而且栈内数据是共享的

2 栈的特殊性----栈内数据共享

栈内一般存放一些基本数据类型的变量,比如int、short、long、byte、float、double、boolean、char以及对象引用。

因此这也就是一般基本数据类型在在传参中不会改变的原因

 

3 栈、栈帧、栈的深度

栈的大小是固定的,栈帧越大,栈的深度越小。栈帧越小,深度越大。

影响栈帧大小的因素:局部变量越多,栈帧越大。传参越多,栈帧越大。

栈帧:局部变量区、操作数栈、帧数据区(运行时常量池的引用、方法返回地址、附加信息)

栈容量的单位为“字宽”,对于32位虚拟机来说,一个“字宽”占4个字节,64位虚拟机来说,一个“字宽”占8个字节,即后面所说的slot

什么是 slot

首先什么是 slot?slot 是局部变量表中的空间单位,虚拟机规范中有规定,对于 32 位之内的数据,用一个 slot 来存放,如 int,short,float 等;对于 64 位的数据用连续的两个 slot 来存放,如 long,double 等。引用类型的变量 JVM 并没有规定其长度,它可能是 32 位,也有可能是 64 位的,所以既有可能占一个 slot,也有可能占两个 slot。

4 栈的大小和设置

可以通过-XSS来设置栈的大小

5 默认栈的大小查看

############################################################
#jinfo -flag MaxHeapSize 6461
#linux: java -XX:+PrintFlagsFinal -version 2>&1 | grep MaxHeapSize
#windows: java -XX:+PrintFlagsFinal -version |findstr MaxHeapSize
#jconsole
#Runtime.getRuntime().maxMemory()
############################################################

6 于栈相关的异常

stackOverFlowError 和 OutOfMemoryError

7 查看每个class文件中每个方法所分配的最大局部变量区的容量的工具

jclasslib开源工具