城市 企业 产品 知识
工业 农业 房产 汽车 家居 服饰 日用 IT 文教 旅游 生活 服务 工商 商务 广告 工程
  • Java虚拟机的栈的三个区域:局部变量区、运行环境区、操作数区

    广州为学教育科技有限公司 2018-12-04 15:52     972次浏览
  • 局部变量区

    每个Java方法使用一个固定大小的局部变量集。它们按照与vars寄存器的字偏移量来寻址。局部变量都是32位的。长整数和双精度浮点数占据了两个局部变量的空间,却按照个局部变量的索引来寻址。(例如,一个具有索引n的局部变量,如果是一个双精度浮点数,那么它实际占据了索引n和n+1所代表的存储空间)虚拟机规范并不要求在局部变量中的64位的值是64位对齐的。虚拟机提供了把局部变量中的值装载到操作数栈的指令,也提供了把操作数栈中的值写入局部变量的指令。

    运行环境区

    在运行环境中包含的信息用于动态链接,正常的方法返回以及异常捕捉。

    动态链接

    运行环境包括对指向当前类和当前方法的解释器符号表的指针,用于支持方法代码的动态链接。方法的class文件代码在引用要调用的方法和要访问的变量时使用符号。动态链接把符号形式的方法调用翻译成实际方法调用,装载必要的类以解释还没有定义的符号,并把变量访问翻译成与这些变量运行时的存储结构相应的偏移地址。动态链接方法和变量使得方法中使用的其它类的变化不会影响到本程序的代码。

    正常的方法返回

    如果当前方法正常地结束了,在执行了一条具有正确类型的返回指令时,调用的方法会得到一个返回值。执行环境在正常返回的情况下用于恢复调用者的寄存器,并把调用者的程序计数器增加一个恰当的数值,以跳过已执行过的方法调用指令,然后在调用者的执行环境中继续执行下去。

    操作数栈

    机器指令只从操作数栈中取操作数,对它们进行操作,并把结果返回到栈中。选择栈结构的原因是:在只有少量寄存器或非通用寄存器的机器(如Intel486)上,也能够地模拟虚拟机的行为。操作数栈是32位的。它用于给方法传递参数,并从方法接收结果,也用于支持操作的参数,并保存操作的结果。例如,iadd指令将两个整数相加。相加的两个整数应该是操作数栈顶的两个字。这两个字是由先前的指令压进堆栈的。这两个整数将从堆栈弹出、相加,并把结果压回到操作数栈中。

    每个原始数据类型都有专门的指令对它们进行必须的操作。每个操作数在栈中需要一个存储位置,除了long和double型,它们需要两个位置。操作数只能被适用于其类型的操作符所操作。例如,压入两个int类型的数,如果把它们当作是一个long类型的数则是非法的。在Sun的虚拟机实现中,这个限制由字节码验证器强制实行。但是,有少数操作(操作符dupe和swap),用于对运行时数据区进行操作时是不考虑类型的。

    本地方法栈,当一个线程调用本地方法时,它就不再受到虚拟机关于结构和限制方面的约束,它既可以访问虚拟机的运行期数据区,也可以使用本地处理器以及任何类型的栈。例如,本地栈是一个C语言的栈,那么当C程序调用C函数时,函数的参数以某种顺序被压入栈,结果则返回给调用函数。在实现Java虚拟机时,本地方法接口使用的是C语言的模型栈,那么它的本地方法栈的调度与使用则完全与C语言的栈相同。

    发布:谢老师
  • 公司简介

    那些年我走过的弯路,疯狂JAVA把我拉回正道

    人生究竟有没有弯路呢?是否走过的每段路都是必经之路?甚至是超越这平凡世界的途径?谈谈我的想法。

    高中毕业那年,在朋友的怂恿下,在填写志愿的时候报了销售相关的专业,说销售容易赚大钱,每个月都能轻松过万。但到了大学毕业后,发现销售并不是我所想的那么简单,销售真的不那么好做,全凭一张嘴,大学里面学的东西几乎用不上,就这样,为人实在的我懵懵懂懂熬过了一年半,每个月就拿那两三千块钱的底薪,运气好就拿点提成,但到手的从来没有超过6000元,在广州这座大城市,想要买房子的话想要靠这点薪水根本不可能。

    幸运的是,在一个偶然的机会遇到了我的小学同学,跟我同一年毕业,现在他已经是一家大公司的高级软件工程师了,年薪达到30万以上,还有公积金,准备在广州买房了。后来我问他是怎么办到的,他说他高中毕业那年就开始报名JAVA开发的培训,因为他认为互联网这个行业非常有发展前景,互联网的技术人才更是市场非常缺失的,如果往这个方向发展肯定能赢取不小的成就;另外,我大学也是报了相关的专业,大学四年里断断续续也做了一些项目,积累了一些经验,所以大学毕业后就被一家大型的互联网公司聘请了。我感到非常惊讶,但对自己一事无成,又不会什么能拿出手的技术,怎么拿那么高的薪水。正当我在抱怨自己的时候,他便说他可以把我介绍到我以前参加培训的那家机构报名参加培训,零基础也没关系,他们会用5个月的时间把你培养成一名合格的软件工程师,在培训期间也会接触到一些项目,到时候出去参加工作的时候就不会担心没有经验了。后来我想了一下,有一技在身,肯定不会饿死自己,便接受了小学同学的建议。果然不出我朋友所言,5个月后,那家培训机构根据我的能力把我推荐到一家公司上班,做软件开发,试用期间居然也能达到七千以上,转正后九千加项目提成,这样一来月入过万岂不是很轻松的事情?为了感谢小学同学的帮助,特意请他去吃大餐。

    如果没有同学的介绍,如果没有那家培训机构老师的悉心教导,我也不会有今天的成就,你们是不是很羡慕呢?如果你们也是不想做销售,又想拿高薪的话,不妨上网也去那家机构了解一下,疯狂java:www.fkjava.org

    联系:谢老师

    手机:13632401219

网店推荐

更多软件网店