会对应一个栈帧在虚拟机栈中入栈到出栈的过程。

Choice_JJ 发布于 2017/07/13 15:08
阅读 143
收藏 0

对于从事C、C++的开发人员而言,在内存管理领域,他们具有绝对的“权利”——拥有每个对象的控制权,并担负着每个对象生命周期的维护责任。而对于Java开发人员而言,在虚拟机自动内存管理机制的帮助下,无需为每一个创建new操作去配对 delete/free 代码,减少内存泄漏和内存溢出的问题,这些都交给了Java虚拟机去进行内存控制,但是正因如此,当出现相关问题时,若不了解JVM使用内存规则,就难以排查错误。接下来以此篇文章记录学习Java虚拟机内存各个区域概念、作用、服务对象以及可能产生的问题。

Java虚拟机在执行Java程序时会将其管理的区域划分为不同的数据区域,不同区域之间拥有各自用途、创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,而有的区域则依赖用户线程的生命周期。Java虚拟机所管理的内容分为以下几块区域:

1 . 程序计数器

(1)含义作用

程序计数器(Program Counter Register)是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。在虚拟机概念模型中,字节码解释器工作时就是通过改变计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器。

(2)计数器与多线程

由于JVM的多线程时通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。所以,为了线程切换后能恢复到正确的执行位置,每条线程需要一个独立的程序计数器,各线程之间计数器互不影响、独立存储,相当于是一块“线程私有”的内存。

(3)虚拟机规范记录(有关异常)

若线程正在执行的是一个Java方法,这个计数器记录的时正在执行的虚拟机字节码指令的地址;若执行的是Native方法,则计数器为空(Undefined)。注意:此内存区域是唯一一个在Java虚拟机规范中没有规定任何 OutOfMemoryError情况的区域。

2 . Java虚拟机栈

(1)含义作用

同程序计数器相同,Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,会对应一个栈帧在虚拟机栈中入栈到出栈的过程。

(2)Java内存区分误区

大多数人以为Java内存区分为堆内存(Heap)栈内存(Stack),这是一种误区,Java内存区域的划分远比这种粗糙的分法更加复杂。这种划分方式广泛流传是由于大多数开发者关注与对象内存分配关系最密切的内存区域就是这两块,有关“堆”的知识后续载提,这里的“栈”指的就是虚拟机栈,或者说是虚拟机栈中的变量表部分。

(3)虚拟机栈中的局部变量表

局部变量表中存放了编译期可知的

  • 八大数据类型(boolean、byte、char、short、int、float、long、double)。
  • 对象引用(reference类型,它不等于对象本身,可能是一个指向对象起始地址的指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)
  • returnAddress类型(指向了一条字节码指令的地址)

其中64位长度的long和double类型的数据会占用2个局部变量空间(Slot),其余数据类型只占用1个。局部变量表所需的内存控件在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。

https://buluo.qq.com/p/detail.html?bid=92799&pid=4685111-1499851502
https://buluo.qq.com/p/detail.html?bid=92799&pid=7168867-1499851175
https://buluo.qq.com/p/detail.html?bid=92799&pid=4685111-1499851146
https://buluo.qq.com/p/detail.html?bid=92799&pid=7168867-1499851041
https://buluo.qq.com/p/detail.html?bid=92799&pid=7168867-1499850942
https://buluo.qq.com/p/detail.html?bid=92799&pid=4685111-1499850686
https://buluo.qq.com/p/detail.html?bid=92799&pid=4685111-1499927979
https://buluo.qq.com/p/detail.html?bid=92799&pid=4685111-1499928004
https://buluo.qq.com/p/detail.html?bid=92799&pid=4685111-1499928027
https://buluo.qq.com/p/detail.html?bid=92799&pid=4685111-1499928383
https://buluo.qq.com/p/detail.html?bid=92799&pid=4685111-1499928368
https://buluo.qq.com/p/detail.html?bid=92799&pid=4685111-1499928350
https://buluo.qq.com/p/detail.html?bid=92799&pid=4685111-1499928735

加载中
返回顶部
顶部