浅析JVM内存划分

来源:互联网 发布:网络赌钱游戏网站 编辑:程序博客网 时间:2024/05/01 08:16

   作为一名Java选手,了解JVM(Java Vitrual Machine)的内存区域划分是很重要的。本文结合多方参考文献和个人理解,来浅析一下JVM划分的内存区域,欢迎各位大牛拍砖指点。  

   在Oracle官方提供的JVM规范中,将JVM的运行时数据区划分为以下几类:程序计数器(PC Register)、JVM栈(Java Virtual Machine Stacks)、本地方法栈(Native Method Stacks)、堆(Heap)、方法区(Method Area)和运行时常量池(Run-Time Constant Pool)。在JVM规范中,Oracle官方已经对各个数据区进行了详细的描述,大家可以前往了解,链接地址如下:

http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5

   为了方便大家的理解,我这里引用来自www.programcreek.com(一个很不错的关注Java技术的网站,推荐之)中关于JVM内存划分的一张图片:

   

    如上图所描绘的,JVM运行时的数据区又可以分为线程私有和线程共享的两大部分,其中程序计数器、JVM栈和本地方法栈是每个线程所私有的,堆、方法区和运行时常量池是各个线程共享的。


   程序计数器(PC Register)

   程序计数器中是每个线程私有的,其中存储了该线程下一条指令所在存储单元的地址。在JVM中,多线程通过时间片来轮转获取CPU,当某个线程获取到CPU时,CPU需要根据线程的程序计数器来恢复现场,并确定要执行的指令。

   

   JVM栈(Java Virtual Machine Stacks)

   JVM栈是每个线程私有的,其中存放的是一个个栈帧(Frame),每个栈帧对应一个被调用的方法。栈帧中包括局部变量表(Local Variables)、操作数栈(Operand Stack)、指向运行时常量池的引用(Reference to runtime Constant)、方法返回地址(Return Address)和一些额外信息。JVM栈空间的分配和释放都是由系统自动实施的,所以在写Java代码时程序员基本不用去关心烦人的内存分配和释放问题。

   为了便于大家的理解,这里引用来自http://www.cnblogs.com/dolphin0520/p/3613043.html中的一张图片:

   

    当线程要调用某个方法时,就会创建一个对应的栈帧,并将其压入JVM栈。由于栈的特性,JVM只能执行处于栈顶的方法,执行完毕以后将该方法对应的栈帧出栈。栈帧中的各个区域描述如下:

   局部变量表:在方法中声明的非静态变量和函数形参。对于基本数据类型的变量,直接存储值;对于引用类型的变量,则存储指向对象的引用。局部变量表的大小在程序编译期间就可以确定,程序执行期间不会发生改变。

   操作数栈:用于算术表达式求值。

   指向运行时常量池的引用:在方法执行过程中可能用到类中的常量,这些常量存储在运行时常量池。

   方法返回地址:一个方法执行结束以后要返回的地址。

   

   本地方法栈(Native Method Stacks)

   本地方法栈是每个线程私有的,它的作用与原理与JVM栈类似,不过是为调用本地方法服务的。

   

   堆(Heap)

   堆是线程所共享的,用于存储对象本身和数组,它是JVM垃圾回收的主要区域。


   方法区(Method Area)

   方法区是线程所共享的,用于存储类信息(包括类名、方法信息、字段信息)、静态变量、常量池和程序编译后生成的代码等,这些信息是在程序编译期间就确定的,程序运行期间不会发生改变。


   运行时常量池(Run-Time Constant Pool)

   在方法区中,常量池用于存储类、接口、方法等中的各种常量(如字符常量),当字节码文件被加载到Java虚拟机中开始执行,运行时常量池就被创建出来。运行时常量池在程序运行期间是可以动态更新的,例如我们可以通过String的intern方法,将一个新的字符常量放入字符常量池(String pool),这里提到的字符常量池是运行常量池中的一部分。


【主要参考文献】

JVM规范:http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5

JVM Runtime Data Area:http://www.programcreek.com/2013/04/jvm-run-time-data-areas/

JVM的内存区域划分:http://www.cnblogs.com/dolphin0520/p/3613043.html

0 0
原创粉丝点击