锁定老帖子 主题:深入java虚拟机第5章, 栈
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2009-01-02
最后修改:2009-03-25
java栈每当启动一个新线程的时候,java虚拟机都会为它分配一个java栈。java以栈帧为单位保存线程的运行状态。虚拟机只会对java栈执行两种操作:以栈帧为单位的压栈或者出栈。
java方法可以通过两种方式完成,一种通过return返回,成为正常返回;一种通过抛出异常而异常终止 。虚拟机都会将当前栈弹出java栈然后释放掉,这样上一个方法的栈帧就是当前栈帧了。
java栈上是此对应的java线程所私有的。因此不存在多线程情况下栈数据访问同步的问题。
栈帧栈帧由三部分组成:局部变量区,操作数栈和帧数据区。 局部变量区和操作数栈要视对应的方法而定,它们是按照字长计算的。
局部变量区: java栈帧的局部变量区被组织为一个以字长为单位,从0开始计数的数组。字节码指令通过从0开始的索引来使用其中的数据。类型为int,float,reference和returnaddress的值在数组中只占一项,而类型为byte,short和char的值在存入数组前都将被转换为int。但是long和double类型在数组中却占据连续的两项。
操作数栈和局部变量区一样。也被组织成一个以字长为单位的数组。但是不是通过索引来访问,而是通过标准栈操作--压栈和出栈来访问。
不同于程序计数器,java虚拟机没有寄存器,程序计数器也无法被程序指令直接访问。java虚拟机是由操作数栈而不是从寄存器中取得操作数的,因此它的运行方式是基于栈的而不是基于寄存器的。
虚拟机把操作数栈作为它的工作区--大多数指令都要从这里弹出数据,执行运算,然后把结果压回操作数栈。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-01-02
楼主写的很好,看了一点,现在没有时间看,以后看,留个爪
|
|
返回顶楼 | |
发表时间:2009-01-03
引用 每当启动一个新线程的时候,java虚拟机都会为它分配一个java栈 java栈上的所有线程都是此线程私有的 说的感觉挺别扭的啊。。 |
|
返回顶楼 | |
发表时间:2009-01-05
lz不知道跟哪翻译的,读起来很不通顺啊
|
|
返回顶楼 | |
发表时间:2009-05-13
frenchmay 写道
java方法可以通过两种方式完成,一种通过return返回,成为正常返回;一种通过抛出异常而异常终止,
如果方法没有return 也没有异常,那方法改如何终止呢? 例如下面的这个方法: public void method(){ System.out.println("方法执行完毕。"); }
|
|
返回顶楼 | |
发表时间:2009-05-13
http_url 写道
frenchmay 写道
java方法可以通过两种方式完成,一种通过return返回,成为正常返回;一种通过抛出异常而异常终止,
如果方法没有return 也没有异常,那方法改如何终止呢? 例如下面的这个方法: public void method(){ System.out.println("方法执行完毕。"); }
void类型也是一种数据类型,也可以返回,如果程序正常终结 遵循第一种通过return返回,成为正常返回 |
|
返回顶楼 | |
发表时间:2009-05-14
今天发现单位有这本书 翻了翻
|
|
返回顶楼 | |
浏览 6604 次