
课程咨询: 400-996-5531
投诉建议: 400-111-8989
认真做教育 专心促就业
Java编程开发语言是目前大多数软件开发程序员都在学习的一种编程开发语言,而本文我们就通过案例分析来简单了解一下,Java编程规范都有哪些要求。
1.程序计数器
程序计数器(ProgramCounterRegister)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。
JVM可以同时支持多个执行线程。每个Java虚拟机线程都有自己的pc(程序计数器)寄存器。在任何时候,每个Java虚拟机线程都在执行单个方法的代码,即该线程的当前方法。如果该方法不是native方法,则pc寄存器包含当前正在执行的Java虚拟机指令的地址。如果线程当前正在执行的方法是native的,则pc寄存器的值为undefined。Java虚拟机的pc寄存器足够宽,可以容纳特定平台上的returnAddress或native指针。
此内存区域是一个在《Java虚拟机规范》中没有规定任何OutOfMemoryError情况的区域。
2.Java虚拟机栈
与程序计数器一样,是线程私有的,生命周期与线程相同。虚拟机栈描述的是Java方法执行的线程内存模型。
「虚拟机栈」里面的每条数据就是「栈帧」,在Java方法执行的时候则创建一个「栈帧」并入栈「虚拟机栈」。调用结束则「栈帧」出栈。
每个栈帧包含四个区域:
局部变量表:存储了方法执行过程中需要用到的所有局部变量
操作数栈:暂存变量,通过变量的入栈、出栈等操作来执行计算
动态连接:翻译符号引用为直接引用,即把一个字面量翻译为运行时的一个地址引用
返回地址
每个线程拥有一个「虚拟机栈」,每个「虚拟机栈」拥有多个「栈帧」,而栈帧则对应着一个方法。每个「栈帧」包含局部变量表、操作数栈、动态链接、方法返回地址。方法运行结束则意味着该「栈帧」出栈。
在《Java虚拟机规范》中,对这个内存区域规定了两类异常状况:
如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;
如果Java虚拟机栈容量可以动态扩展(HotSpot虚拟机的栈容量不能动态扩展),当栈尝试扩展时无法申请到足够的内存,或为一个新线程初始化JVM栈时没有足够的内存时会抛出OutOfMemoryError异常。
3.本地方法栈
本地方法栈(NativeMethodStacks)与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native)方法服务。
《Java虚拟机规范》对本地方法栈中方法使用的语言、使用方式与数据结构并没有任何强制规定,因此具体的虚拟机可以根据需要自由实现它,甚至有的Java虚拟机(譬如Hot-Spot虚拟机)直接就把本地方法栈和虚拟机栈合二为一。与虚拟机栈一样,本地方法栈也会在栈深度溢出或者栈扩展失败时分别抛出StackOverflowError和OutOfMemoryError异常。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。