java虚拟机内存区域简单介绍

首先看一张图:
这里写图片描述
由图可看出java虚拟机在执行java程序时会把它管理的内存分为5 个数据区域,其中有些区域是随着虚拟机进程的启动而存在的,有些是依赖用户线程的启动和结束而建立和销毁的。

程序计数器

程序计数器也叫指令计数器,pc, 用于存储下条指令的地址内容。在java虚拟机中,pc是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器,其中分支、循环、跳转、异常处理和线程恢复等基础功能都需要依赖这个计数器来完成。

java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说也就是一个内核)只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都必须要有一个独立的程序计数器。也就是说,程序计数器区域是属于线程私有的内存。

虚拟机栈

java虚拟机栈也是属于线程私有的,因而它的生命周期也就自然与线程相同。虚拟机栈描述的是java方法执行的内存模型:每个方法被执行的时候都会同时创建一个占帧,用于存储局部变量表,操作栈,动态链接,方法出口等信息。每个方法被调用直至完成的过程,就对应一个栈帧在虚拟机栈中从入栈到出栈的过程。

其中,局部变量表存放了编译期可知的各种基本数据模型(boolean、short、int、long、double、float和对象引用reference(不等同与对象本身,根据虚拟机的实现,可能是指向对象起始地址的指针,也可能是指向一个对象的句柄)),所需的内存空间也是在编译期完成分配的,在方法运行期间不会改变局部变量表的大小。

本地方法栈

本地方法栈和虚拟机栈是非常相似的,区别不过是虚拟机栈为虚拟机执行java方法服务,而本地方法栈则是为虚拟机用到的Native方法服务。

java堆

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

因此,java堆是垃圾收集器管理的主要区域,因此很多时候也叫GC堆。如果从内存回收的角度来看,由于现在的收集器基本都是采用分代收集算法,所以java堆还可以细分为:新生代和老年代,再细致一点迭代有Eden空间、from Survivor空间、To Survivor空间等。

方法区

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

这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载。

运行时常量池

运行时常量池是方法区的一部分,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池。

扫描二维码关注公众号,回复: 5401285 查看本文章

对象访问

介绍完虚拟机的运行时数据区之后,我们可以探讨一个问题:在java中,对象访问时如何进行的?对象访问在java语言中无处不在,即使是最简单的访问,也会涉及java栈、java堆、方法区这三个最重要区域之间的关联关系:
Object obj = new Object(),假设这句代码出现在方法体中,那“Object obj”这部分语义将会反映到java栈中的局部变量表中,作为一个reference类型数据出现。而“new Object()”这部分的语义将反映到java堆中,形成一块存储了Object类型所有实例数据值(对象中各个实例字段的数据)的结构化内存。另外,在java堆中还必须包含能够找到此对象类型数据(如对象类型、父类、实现的接口、方法等)的地址信息,这些类型数据则存储在方法区中。

其中,reference类型数据在java虚拟机中只规定了一个指向对象的引用,前面我们已经说了reference数据根据虚拟机的实现,可能是指向对象起始地址的指针,也可能是指向一个对象的句柄,目前主流的访问方式主要有两种:使用句柄和使用指针。

使用句柄

如果使用句柄访问方式,java堆中会划分出一块内存来作为句柄池,reference中存储的对象就是句柄地址,而句柄中包含了对象实例数据和类型数据各自的具体地址信息。
这里写图片描述

使用直接指针

如果使用直接指针访问方式,java堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,reference中直接存储的就是对象地址:
这里写图片描述

两种方式比较

使用句柄访问方式的最大好处就是reference中存储的是稳地的句柄地址,在对象被移动(垃圾收集时移动对象是非常铺普遍的行为)时只会改变句柄中的实例数据指针,而reference本身不需要被修改。

使用直接指针访问方式的最大好处是速度更快,他节省了一次指针定位的时间开销,由于对象的访问在java中是非常频繁的,因此这类开销积少成多后也是一项非常可观的执行成本。

猜你喜欢

转载自blog.csdn.net/lks1139230294/article/details/75088363
今日推荐