JVM对自身内存空间的划分

划分了五个区域

JVM内存的划分

一:寄存器

虚拟机的pc寄存器是用于存放下一条将要执行的指令的地址(字节码流)。程序员

二:本地方法栈

本地方法栈与Java栈的做用和原理很是类似。区别只不过是Java栈是为执行Java方法服务的,而本地方法栈则是为执行本地方法(Native Method)服务的。在JVM规范中,并无对本地方法栈的具体实现方法以及数据结构做强制规定,虚拟机能够自由实现它。在HotSopt虚拟机中直接就把本地方法栈和Java栈合二为一。数组

三:方法区

方法区在JVM中也是一个很是重要的区域,它与堆同样,是被线程共享的区域。在方法区中,存储了每一个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。数据结构

在Class文件中除了类的字段、方法、接口等描述信息外,还有一项信息是常量池,用来存储编译期间生成的字面量和符号引用。spa

在方法区中有一个很是重要的部分就是运行时常量池,它是每个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后,对应的运行时常量池就被建立出来。固然并不是Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中,好比String的intern方法。线程

在JVM规范中,没有强制要求方法区必须实现垃圾回收。不少人习惯将方法区称为“永久代”,是由于HotSpot虚拟机以永久代来实现方法区,从而JVM的垃圾收集器能够像管理堆区同样管理这部分区域,从而不须要专门为这部分设计垃圾回收机制。不过自从JDK7以后,Hotspot虚拟机便将运行时常量池从永久代移除了。设计

四:JVM栈(方法栈)

Java栈中存放的是一个个的栈帧,每一个栈帧对应一个被调用的方法,在栈帧中包括局部变量表(Local Variables)、操做数栈(Operand Stack)、指向当前方法所属的类的运行时常量池(运行时常量池的概念在方法区部分会谈到)的引用(Reference to runtime constant pool)、方法返回地址(Return Address)和一些额外的附加信息。当线程执行一个方法时,就会随之建立一个对应的栈帧,并将创建的栈帧压栈。当方法执行完毕以后,便会将栈帧出栈。所以可知,线程当前执行的方法所对应的栈帧一定位于Java栈的顶部。对象

五:堆

Java中的堆是用来存储对象自己的以及数组(固然,数组引用是存放在Java栈中的)。只不过和C语言中的不一样,在Java中,程序员基本不用去关心空间释放的问题,Java的垃圾回收机制会自动进行处理。所以这部分空间也是Java垃圾收集器管理的主要区域。另外,堆是被全部线程共享的,在JVM中只有一个堆。blog

相关文章
相关标签/搜索