JVM 虚拟机 内存说明

Java虚拟机所管理的内存图:java

 

 

1程序计数器:数组

该模块做用是记录线程执行字节码的位置,记录程序执行状态,以便该线程下次得到CPU时继续执行。程序里的每一个线程程序计数器相互独立,互不影响,该内存区也称“线程私有”内存。线程

二、java虚拟机栈:对象

         与程序计数器同样,java虚拟机栈也是“线程私有”,’每一个方法执行的时候进入虚拟机栈,会建立一个栈帧,用于存储局部变量表,操做栈,动态连接,方法出口等信息,每个方法从调用到执行完成,对应着每个栈帧在虚拟机栈中从入栈到出栈的过程。blog

         其中局部变量表包括java基本数据类型以及对象引用类型(reference)、returnAddress类型,该区域在代码编译时即肯定占用内存大小,不会在执行方法中改变。内存

         在虚拟机规范中,该区会产生两种异常,一种是线程请求的栈深度大于虚拟机所容许的深度会抛出StackOverFlowError 异常;当虚拟机动态拓展java虚拟机栈没有足够的内存时,会产生OutOfMemoryError异常编译器

三、本地方法栈虚拟机

         本地方法栈跟java虚拟机栈相似,不过java虚拟机栈是为java方法(java字节码)服务,本地方法栈是为Native方法服务,本地方法栈也会抛出StackOverFlowError以及OutOfMemoryError异常。编译

四、Java堆变量

         Java堆是java虚拟机占用内存最大一块,全部对象共享该内存区。该区域存放对象,全部实例对象以及数组都在该区域分配内存进行实例化(随着JTI编译器的发展与逃逸分析技术的成熟,该说法再也不绝对)

         Java堆是垃圾回收的主要区域,该区域实例化时可用是连续的内存区域或者分开的区域,只要逻辑上是连续的便可,若是该区域实例化的时候分配不到内存或成熟OutOfMemoryError异常。

五、方法区

         方法区和java堆同样都是共享区域,用于存储虚拟机已经加载的类信息、常量、静态变量以及即时编译器编译的代码数据,虽然java虚拟机规范描述该区为java堆的逻辑部分,可是该区有一个别名“非堆”,应该区分为方法区。

六、运行常量池

         运行时常量池是方法区的一部分。Class文件中除了有版本、字段、方法、描述等信息,还有一项常量池,用于存储编译期生成的各类字面量和符号引用。

七、直接内存

相关文章
相关标签/搜索