首页 > 其他 > 详细

虚拟机栈-简介

时间:2020-06-04 20:36:55      阅读:39      评论:0      收藏:0      [点我收藏+]

注意:以下都是从网上转载过来的。如果有自己的想法,完全是猜测,不足为准。

 

1,虚拟机栈是什么?

   每个线程都会有一个虚拟机栈,多线程就会有多个虚拟机栈。虚拟机栈里面是一个一个的栈帧(Stack Frame),每一个栈帧都是在方法执行的同时创建的,描述的是Java方法执行的内存模型。每一个方法从调用开始至执行完成的过程,都对应着一个栈帧在虚拟机里面从入栈到出栈的过程。栈是先进后出的,就像递归一样,你打开一扇门,进入了房间A,在里面搞了点事情,然后需要去房间B去搞点东西,但是你又不能离开房间A,只能在房间A里开了一扇门,去了房间B,在房间B里面把事情处理好了,要想回到起点,肯定是要经过房间A的;所以你先进入了A,却是先从B出来,再从A后出来,先进后出。所以你方法A中调用了方法B,虽然是先进入了方法A,后进入了方法B,却是先从B出来,再从A出来。

在活动线程中,只有位于栈顶的栈帧才是有效的,称为当前栈帧,与这个栈帧相关联的方法称为当前方法。

执行引擎运行的所有字节码指令都只针对当前栈帧进行操作。

 

2,栈帧-局部变量表

   存放方法参数和方法内部定义的局部变量。在Java编译为Class文件时,就已经确定了该方法所需要分配的局部变量表的最大容量:如下图所示的随便的一个例子

  技术分享图片

 

   即使方法内有各种for循环、while循环等,这个最大容量也是确定的,如图所示的4个地方,只要分配这个4个东西的容量就行了;当然indexChar完全没必要定义,从性能的角度,只是为了简单说明,一旦java文件编译成了class文件后,该方法需要分配在栈上的容量都是完全可以确定的,只有堆上的容量是变化的。我猜,indexChar虽然每次循环时,都会创建一次,但是在栈里面,肯定是复用一个就行了。

虚拟机栈-简介

原文:https://www.cnblogs.com/seeall/p/13045828.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!