深入理解JAVA虚拟机之———JVM内存结构

Java从1.7到1.8,虚拟机管理的内存结构方面发生了一些变化,下面主要介绍jdk1.7,1.8的虚拟机运行时内存结构划分。

深入理解JAVA虚拟机之———JVM内存结构_第1张图片

深入理解JAVA虚拟机之———JVM内存结构_第2张图片

下面介绍每一部分:

程序计数器:线程私有,该部分不会抛出OOM,生命周期和线程相同。虚拟机中唯一一个不会抛出OOM错误的区域。当前线程所执行的字节码的行号指示器。字节码解释器工作时根据程序计数器来选取要执行的下一条字节码指令,分支,循环,跳转,异常处理,线程恢复都需要这个计数器。如果线程正在执行的是一个java方法,则这个计数器记录的是正在执行的虚拟机字节码指令的地址。如果是一个本地方法,则该计数器为空。

虚拟机栈:线程私有,生命周期和线程相同。每个方法在执行的过程中都会创建一个栈帧,里面包含了1.局部变量表(基本数据类型,对象的引用,可能是一个指向具体对象的指针,句柄或与具体对象关联的东西和返回地址类型。局部百年量表在编译期间分配内存空间),2.操作数栈,3.动态链接,4.方法出口等信息,每一个方法在执行过程中对应栈帧从入栈到出栈的过程。

本地方法栈: 线程私有,为虚拟机用到的本地方法服务。

堆:线程共享,虚拟机在运行时主要的内存区域。生命周期和虚拟机生命周期一致。实例对象和数组都是在堆上分配。

方法区:线程共享,生命周期和虚拟机相同。主要用于存放:被虚拟机加载的类信息(版本,字段,方法,接口),常量,静态变量,即时编译器编译后的代码数据。

元数据空间:JDK1.8引入的,线程共享,存放class加载相关信息

直接内存:直接内存不属于虚拟机一部分,但是JDK1.4后,引入了NIO,通过NIO使用Native函数库方法来分配堆外内存,通过DriectByteBuffer对象来操作这块堆外内存,避免了在某些场景下频繁的在java堆和Native堆中来回复制数据。

你可能感兴趣的:(深入理解java虚拟机,JVM内存结构,深入理解JVM)