5.3.7 java栈

每当启动一个新线程时,Java虚拟机都会为它分配一个java栈。前面我们曾经提到Java栈以帧为单位保存线程运行状态。虚拟机只会直接对java栈执行两种操作:以帧为单位的压栈或出栈。

某个线程正在执行的方法被称为该线程的当前方法,当前方法使用的栈帧称为当前帧,当 前方法所属的类称为当前类,当前类的常量池称为当前常量池。在线程执行一个方法时,它会跟踪当前类和当前常量池。此外,当虚拟机遇到栈内操作指令时,它对当前帧内数据执行操作。

每当线程调用一个Java方法时,虚拟机都会在该线程的Java栈中压入一个新帧。而这个新帧 自然就成为了当前帧。在执行这个方法时,它使用这个帧来存储参数、局部变量、中间运算结果等等数据。

Java方法可以以两种方式完成。一种通过return返回的,称为正常返回;一种是通过抛出异 常而异常中止的。不管以哪种方式返回,虚拟机都会将当前帧弹出Java栈然后释放掉,这样上一 个方法的帧就成为当前帧了。

Java栈上的所有数据都是此线程私有的。任何线程都不能访问另一个线程的栈数据,因此我 们不需要考虑多线程情况下栈数据的访问同步问题。当一个线程调用一个方法时,方法的局部变 量保存在调用线程Java栈的帧中。只有一个线程能总是访问那些局部变量,即调用方法的线程。

像方法区和堆一样,Java栈和帧在内存中也不必是连续的。帧可以分布在连续的栈里,也可 以分布在堆里,或者二者兼而有之。表示Java栈和栈帧的实际数据结构由虚拟机的实现者决定, 某些实现允许用户指定Java栈的初始大小和最大最小值。

posted @ 2019-12-03 21:09  mongotea  阅读(106)  评论(0编辑  收藏  举报