深入理解JAVA虚拟机2:JVM内存结构

内存结构一览

在上一篇文章中,我们最后给出了一幅图

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

这幅图中,就包含了JVM的内存结构的所有组成元素,他们分别是:java堆内存、java栈、方法区、本地方法区以及pc寄存器,接下来我们就对这些区域逐一介绍。

java堆

      Java堆是Java虚拟机所管理的内存中最大的一块。是线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。

       Java堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC堆”。如果从内存回收的角度看,由于现在收集器基本都是采用的分代收集算法,所以Java堆中还可以细分为:新生代和老年代;再细致一点的有(伊甸区)Eden空间、(幸存者区)From Survivor空间、To Survivor空间等。

       根据Java虚拟机规范的规定,Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可,就像我们的磁盘空间一样。在实现时,既可以实现成固定大小的,也可以是可扩展的,不过当前主流的虚拟机都是按照可扩展来实现的(通过-Xmx和-Xms控制)。

如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。

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

java栈

      栈是每个线程私有的区域,它的生命周期与线程相同,一个线程对应一个java栈,每执行一个方法就会往栈中压入一个元素,这个元素叫“栈帧”,而栈帧中包括了方法中的局部变量、用于存放中间状态值的操作栈,这里面有很多细节,我们以后再讲。如果java栈空间不足了,程序会抛出StackOverflowError异常,想一想什么情况下会容易产生这个错误,对,递归,递归如果深度很深,就会执行大量的方法,方法越多java栈的占用空间越大。

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

方法区(也叫做持久区)

      方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

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

 

本地方法区

      本地方法栈角色和java栈类似,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而它是为虚拟机使用到的native方法服务,本地方法栈存放的方法调用本地方法接口,最终调用本地方法库,实现与操作系统、硬件交互的目的。

程序计数器

       当我们的类加载完毕的时候,实例对象、方法、静态变量都去了自己改去的地方,那么问题来了,程序该怎么执行,哪个方法先执行,哪个方法后执行,这些指令执行的顺序就是PC寄存器在管,它的作用就是控制程序指令的执行顺序。如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Natvie方法,这个计数器值则为空(Undefined)。此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

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

总结

     上文对JVM内存结构进行了个简单的介绍,并对对其组成元素逐一进行了介绍,让我们对JVM内存结构有了更加全面的认识。

你可能感兴趣的:(深入理解java虚拟机)