JVM的内存区域划分
Java程序交由JVM(Java Virtual Machine)执行的,因此下面讨论JVM内存区域划分;
一、Java程序执行过程
Java源代码(.java)被Java编译器编译成字节码文件(.class),再由JVM中的类加载器加载各个类的字节码文件,加载完毕后交由JVM执行引擎执行。
整个程序执行过程中,JVM会用一段空间存储程序执行期间所用的数据和相关信息,称为运行时数据区(JVM内存)。
二、运行时数据区组成
1 程序计数器(PC寄存器)
用以指示执行哪条指令;
由于程序计数器中存储的数据所占空间的大小不会随程序的执行而变动,因此不会发生内存溢出现象;
2 Java栈(虚拟机栈)
存放一个个的栈帧,每个栈帧对一个被调用的方法,在栈帧中包括局部变量表、操作数栈、指向当前方法所属类的运行时常量池的引用、方法的返回地址和一些额外的附加信息;
当线程执行一个方法时,随之创建一个对应的栈帧,并将建立的栈帧压栈;当方法执行完毕,将栈帧出栈;
2.1 局部变量表
存储方法中的局部变量(包括方法中声明的非静态变量和函数形参);
对于基本数据类型的变量,直接存储它的值;对于引用类型的变量,存储指向对象的引用;
2.2 操作数栈
程序中的所有计算过程都是借助于操作数栈完成的;
2.3 指向运行时常量池的引用
方法执行过程中可能用到类中的常量,则必须有一个引用指向运行时常量池;
2.4 方法的返回地址
当一个方法执行完,通过方法的返回地址返回之前调用它的地方;
3 本地方法栈
本地方法栈与Java栈的原理类似,区别在于Java栈是为执行Java方法服务,本地方法栈是为执行本地方法(Native Method)服务的;
4 方法区
存储每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等;
方法区被所有线程共享;
方法区中有一部分是运行时常量池;在类和接口被加载到JVM后,对应的运行时常量池就会被创建;
5 堆
存储对象本身以及数组(数组引用存放在Java栈中);
Java中,程序员不必关心空间释放,Java的垃圾回收机制自动进行处理;
堆被所有线程共享,在JVM中只有一个堆;
注明:此文章是转载海子的博文,详情见:http://www.cnblogs.com/dolphin0520/p/3613043.html