关于JVM内存区域划分的一些认识

来源:互联网 发布:网络写手收入排行 编辑:程序博客网 时间:2024/05/21 15:06
2016.10.13 19:00-20:00&21:00-22:00

JVM的内存区域划分:
1.jvm是指java虚拟机( Java Virtual Machine )。

2.下图为java程序具体的执行过程:

如上图所示,首先java源代码文件(.java后缀)会被java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文件,加载完毕之后交由JVM执行引擎执行。在整个执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息。这段空间一般被成为Runtime Data Area(运行时数据区),也就是我们常说的JVM内存。因此,在java中我们常常说到的内存管理,就是针对这段空间进行管理(如何分配和回收内存空间)。

3.运行时数据区通常包括:程序计数器、java栈、本地方法栈、方法区、堆,五个部分。

(1)程序计数器( Program Counter Register ):用来指示执行哪条指令的。
也有称作为PC寄存器,在汇编语言中,程序计数器是指CPU中的寄存器,他保存的是程序当前执行的指令的地址(也可以说保存下一条指令所在的存储单元的地址),当CPU需要执行指令时,需要从程序计数器中得到当前需要执行的指令所在的存储单元的地址,然后根据得到的地址获取指令,在得到指令之后,程序计数器自动加1或者根据转移指针得到下一条指令的地址,如此循环,直至执行完所有的指令。
虽然JVM中的程序计数器并不像汇编语言中的程序计数器一样是物理概念上的CPU寄存器,但是JVM中的程序计数器的功能跟汇编语言中的程序计数器的功能在逻辑上是等同的,也就是说,用来指示执行哪条指令的。
在JVM中,多线程是通过线程轮流切换来获得CPU执行时间的,但是在任一具体时刻,一个CPU的内核只会执行一条线程中的指令,因此,为了能够使每个线程都在线程切换后能够恢复在切换之前的程序执行位置,每个线程都需要有自己独立的程序计数器,并且不能互相干扰,否则就会影响到程序的正常执行次序。因此,可以理解为,程序计数器是每个线程所私有的
在JVM规范中规定,如果线程执行的是非native方法,则程序计数器中保存的是当前需要执行指令的地址,如果线程执行的是native方法,则程序计数器中的是为undefined。
由于程序计数器的数据所占的空间大小并不会随程序的执行而发生变化,所以对于程序计数器来说是不会发生内存一处现象的(OutOfMemory-OOM)。

(2)Java栈:java方法执行的内存模型。

java栈中存放的是一个一个的栈帧,每个栈帧对应一个被调用的方法,栈帧中包含:局部变量表、操作数栈、指向当前方法所属的类的运行时常量池的引用、方法返回地址、额外附加信息。
局部变量表:用来存储方法中的局部变量(非静态变量和函数形参)。基本数据类型变量直接存储值,引用类型变量存储指向对象的引用。局部变量在编译器就可以确定大小了,因此在程序执行期间局部变量表的大小是不会改变的。
操作数栈:程序中所有计算过程都是借助于操作数栈完成的。
指向运行时常量池的引用:因为在方法执行过程中有可能需要用到类中的常量,因此必须要有一个引用指向运行时常量池。
方法返回地址:当一个方法执行完毕之后,要返回之前调用他的地方,因此在栈帧中必须保存一个方法返回地址。
由于每个线程正在执行的方法可能不同,因此每个线程都会有一个自己的java栈,互不干扰。

(3)本地方法栈:为了执行本地方法(Native Method)服务的。
在JVM规范中,并没有对本地方法的具体实现和数据结构做强制规定,虚拟机可以自由实现他,在HotSopt虚拟机中直接就把本地方法栈和Java栈合二为一。

(4)堆:用来存储对象本身以及数组(数组引用是存放在java栈中的)。
堆是被所有线程共享的,在JVM中只有一个堆。

(5)方法区:存储类每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。
方法区是被线程共享的。
class文件中除了类的字段、方法、接口等描述信息外,还有一项信息是常量池,用来存储编译期间生成的字面量和符号引用。在方法区中有一个非常重要的部分就是运行时常量池,他是每个类或接口的在class文件中的常量池的运行时表示形式,在类和接口被加载到JVM之后,对应的运行时常量池就会被创建出来,然而并非class文件常量池中的内容才能进入运行时常量池,在运行期间也可以将新的常量放入运行时常量池中,比如String的intern方法

(题外话:
1.java native method,本地方法,就是一个java调用非java代码的接口,该方法的实现是由非java语言实现的,比如c
2.hotspot)

参考网址:
http://www.cnblogs.com/dolphin0520/p/3613043.html
0 0