您的位置:首页 > 编程语言 > Java开发

深入理解JAVA虚拟机,JVM内存划分笔记

2016-03-17 00:00 148 查看
摘要: Simple概述 JVM运行时数据区域划分

1.Program Counter Register (程序计数器)
它是一块较小的内存空间,可以把它看做当前线程执行字节码的行号指示器,每一个线程都有自己的运行指令器(称之为“线程私有内存”),与其他线程互不影响,如果执行的是Native方法,计数器的值为Undefined,此内存区域是唯一一个没有在JVM规范中没有规定任何OutOfMemoryError的区域。

2.VM Stack (JAVA虚拟机栈)
线程私有,生命周期与线程一致。描述Java方法执行的内存模型,每个方法执行的过程都会创建一个(Stack Frame,用于存储局:部变量表(它存放Java的基本数据类型,reference类型,returnAddess类型,内存大小是在编译时可确定的),操作数栈,动态链接,方法出口等信息),其中long 和double会占用局部变量表的2个空间(Slot),而其他类型只占用1个。
每个方法从调用到执行结束都对应着一次(Stack Frame)的入栈和出栈过程。
在JVM规范中对此区域定义了两种异常:当线程请求大于JVM允许的深度,抛出StackOverflowError,如果虚拟机允许动态扩展内存,但扩张时无法申请到足够的内存抛出OutofMemoryError。

3.Native Method Stack (本地方法栈)
与上述VM Stack非常相似,区别在于VM Stack为JVM执行Java方法服务,而它为本地方法服务。
它同样会抛出VM Stack的两种异常。

4.Heap (JAVA堆)
对于大多数应用,JAVA 堆区是JVM所管理中内存区域最大的一个, 它是被所有线程共享的内存区域,在虚拟机启动时创建。
JAVA堆区是垃圾收集器主要管理的区域,因此很多时候也被称作为GC 堆(garbage collected heap)。

此区域唯一的目的就是存放对象实例,几乎所有的对象实例都存放在这里分配内存,JVM规范描述是所有对象和数组的内存都在此空间分配,但是由于JIT编译器发展成熟,栈上内存分配发生了微妙变化,这一点并不是那么绝对了。
当前主流虚拟机大多是可动态扩展内存的,如果在分配内存时没有内存可以分配并且该区域无法动态扩展,则会抛出OutOfMemoryError。该区域可以通过JVM参数配置内存大小等相关信息。

5.Method Area (方法区)
与JAVA堆区一样,它也是被所有线程共享的,它用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然JVM规范把它描述为堆的一个逻辑部分,但它有个别名Non-Heap,目的应该是与Heap区分开来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: