1.内存中的栈与堆
栈是运行时的单位(所解决的是运行问题,操作程序的执行)
堆是存储的单位(所解决的是数据存储问题,主要管数据的方法(怎么放,放在哪))
2.Java虚拟机栈
2.1 java虚拟机栈是什么?
每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧,对应着一次次的Java方法调用。是线程私有的。
2.2 生命周期
生命周期和线程一致,随着线程的创建而创建,随着线程的销毁而销毁
2.3 作用
主管Java程序的运行,它保存方法的局部变量(8个基本数据类型(表1),对象的引用地址)、部分结果,并参与方法的调用和返回。
Java中八个基本数据类型 | |
整型 | byte、short、int、long |
字符型 | char |
浮点型 | float、double |
布尔型 | boolean |
表1
2.4栈的特点
栈是一种有效的分配存储方式,访问速度仅次于程序计数器。(因为它所涉及到的只有出栈和进栈以及执行结束后的出栈工作),同时对于栈来说,不存在垃圾回收问题,因为他就会出栈来排除垃圾。
2.5 栈中可能出现的异常
上面说到栈不会存在垃圾回收问题。但是它会出现其他问题。
Java虚拟机规范允许Java栈的大小动态或者固定的,如果采用固定的方法,当线程请求分配的虚拟机栈大于虚拟机栈允许的最大容量,Java虚拟机就会抛出StackOverflowError异常。如果Java虚拟机栈可以动态扩展,当尝试扩展时,无法申请到足够的内存。或者创建新的线程时没有足够的内存去创建对应的虚拟机,那Java虚拟机将会抛出OutOfMemoryError异常。
2.6 栈帧
没有线程都有对应的栈,而栈中的数据都是以栈帧的格式存在的,在线程中执行的每个方法都对应着一个栈帧,栈帧是一个内存区块,是一个数据集,维系着方法执行过程中的各种数据信息。
JAVA虚拟机中的栈只有两个操作,就是进栈和出栈。这样在某一时间,只会有一个栈帧在运行,这个栈帧就是当前栈帧,那么栈帧对应的方法就是当前方法,方法对应定义的类,就是当前类。执行引擎内所有的字节码指令都是针对当前栈帧的,如果该方法调用其它方法,就会把其他方法作为新的栈帧放入栈帧,变为当前栈帧。
不同线程之间的栈帧是不能相互引用的,同时当前方法执行的结果会给下一个栈帧,然后虚拟机丢弃当前栈帧,JAVA中有两种返回方式,一种是正常返回(return),另一种是抛出异常。