JVM内存模型
2020-12-07 / highPhone啊

JVM1.6内存模型如下:

1 程序计数器(Program Counter Register)

程序计数器是线程私有的,是一个比较小的内存空间。它可以看作是当前线程当前字节码执行的行号指示器。在线程切换后也依赖程序计数器来使线程回到正确的位置继续执行。如果当前线程执行的是Java方法,程序计数器记录的当前执行的字节码指令在内存中的地址,如果执行的是本地native方法,程序计数器记录的空(undefied)。PS:
程序计数器也是jvm运行时数据区中唯一没有OutOfMemoryError出现的区域

2.虚拟机栈(Java Vitual Mechine Stack)

虚拟机栈也是线程私有的,它描述的是JVM执行java方法的内存模型,jvm每调用一个方法,都会创建一个栈帧,该栈帧中包含了此方法的局部变量表、操作数、动态链接、方法出口等信息。每个java方法从被调用到执行结束,就对应这它的栈帧从入栈到出栈的过程。因此,main方法作为java程序的入口,它的栈帧就在虚拟机栈的最底部,当main方法的栈帧出栈后,线程也就结束了。虚拟机栈的空间不是无限大的,当方法栈空间满了后,会抛出StackOverFlowError,例如深度过大的递归。在某些虚拟机实现中,虚拟机栈可以动态扩容,当动态扩容无法申请到更多内存时,会抛出OutOfMemoryError。

3.本地方法栈(Native Method Stack)

本地方法栈与虚拟机栈的作用类似,它区别于虚拟机栈的地方是虚拟机栈是为java方法服务的,而本地方法栈则是为java调用的本地Native方法服务的,jvm调用本地Native方法的时候,会通过本地方法栈调用本地方法接口(Java Native Interface JNI),从而可以使java可以调用到本地方法库,例如c和c++的库。

4.Java堆(Java Heap)

Java堆是jvm中所有线程共享的一块内存区域,几乎所有对象的实例化都在堆中完成。如果在堆中无法为实例分配内存,而且堆无法再扩展的时候,会抛出OutOfMemoryError。堆也是java垃圾收集器管理的主要区域(Garbage Collected)。关于堆的垃圾回收机制将在后面的笔记中补充。

5.方法区(Method Area)

方法区是堆中的一块特殊区域,它也是线程共享的,用于存放已经被jvm加载的类信息、常量池、静态变量等数据。在HotSpot虚拟机jdk1.6版本是把方法区实现为永久代,在jdk1.7版本中把常量池从方法区中移出,放到堆中,而在jdk1.8中,移除了永久代,改用元空间来实现方法区。

本文链接:https://highphone.xyz/3e83b217.html