jvm 运行时内存数据区

来源:互联网 发布:淘宝推广网站大全 编辑:程序博客网 时间:2024/05/23 18:42

jvm 运行时管理的各个数据区域及各个区域的作用:
1.内存结构如下图:
这里写图片描述

程序计数器:是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。为了线程切换后能恢复到正确的位置,程序计数器是每个线程独立拥有的,互不影响,独立存储,称为线程私有的内存;另外:如果线程正在执行的是一个java的方法,这个程序计数器记录指向的是虚拟机字节码的指令地址;如果是native方法,这个计数器记录的值为空,此区域是唯一一个在jvm规范中没有规outOfMemoryError 情况的区域。
java虚拟机栈:也是线程私有的,生命周期与线程相同;它描述的是java方法执行的内存模型:每个方法在执行的同时会创建一个栈帧用于存储局部变量表(存放编译期可知的各种基本数据类型类型、对象引用类型、 returnAddress类型)、操作数栈、动态链接、方法出口信息,每一个方法从调用到完成,对应一个栈帧的入出;jvm规范中这个区域存在两种异常情况:内存溢出和StackOverflowError(当前线程深度大于jvm所允许的深度时)异常。
本地方法栈:与虚拟机栈作用类似,一个是为虚拟机执行java方法(字节码)服务,本地方法栈则是虚拟机执行native方法服务的。
jvm规范中这个区域存在异常情况与jvm栈相同。
java堆:几乎所有的对象都在这里分配;下一篇详细说明
方法区:与堆一样线程共享;用于存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,jvm规范把方法区描述为堆的一个逻辑部分。存在内存溢出异常。
运行时的常量池:方法区的一部分,class文件中除了有类的版本信息、字段/方法、接口等描述信息外,还有一项常量池信息,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放;还会把编译出来的直接引用也存储在这一部分,运行时常量池相对于class文件常量池的另外一个重要特征具备动态性,运行期间产生常量也将放入;存在内存溢出异常。
直接内存:不是虚拟机运行时数据区的一部分,也不是jvm规范中定义的内存区域,这部分区域也被频繁的调用,存在内存溢出异常;nio 中的buffer channl就是用的这部分。

原创粉丝点击