JVM运行时数据区域的几个概念

学习笔记

java虚拟机在运行时会把他管理的内存划分为几个区域,这些个区域有自己的创建和销毁时间,有些区域随着jvm进程的启动而存在,有的区域则依赖用户的线程启动或结束而存在

1、程序计数器

 程序计数器是一块较小的空间,它可以看做是当前线程执行的字节码的行号,解释器通过改变这个计数器的值来选取下一条要执行的指令,但是如果执行的是本地方法,计数器的值是undefind,现代计算器的每个核都在同时执行不同的指令,因此计数器是线程私有的

2、java虚拟机栈

和其他语言一样,程序的执行离不开栈的存在,同时和计数器一样也是线程私有的,他的生命周期和线程相同,每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法的出口等信息,其中局部变量表存储了编译器可知的各种基本数据类型 int double 以及对象引用等类型,但是他不等于对象本身,类似于C语言一样指向对象的起始地址。局部变量表在编译器可知,运行期不会改变其大小

tip:因为对象有类型,可以计算这个类型所占用的地址大小,所以指向对象起始地址便可以读取这个对象的全部数据

3、本地方法栈

这个就是本地c/c++方法执行的栈,发挥的作用和虚拟机栈类似

4、java堆

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

对象的实例以及数组都要在堆上分配,由于现代垃圾收集器基本都采用分代回收算法,所以堆中还可以细分为新生代和老年代,再细致一点的就是Eden空间,From Survivor空间,To Survivor空间等,从内存分配的角度来看,还可能划分出多个线程私有的分配缓冲区等,但无论哪个区域分配的都是java的对象实例

5、方法区

与java堆一样是各个线程共享的内存区域,存储已经被虚拟机加载的 类信息,常量,静态变量,即时编译器编译之后的本地代码等数据,虽然java虚拟机把方法区描述为堆的一个逻辑部分,但他还是有一个别名叫Non-Heap 目的应该是与java堆分开来,但人们更愿意称此区域为永久代,但二者并不等价

运行时常量池属于方法区的一部分,Class文件除了有类的版本,字段,方法,等描述信息之外,还有一些是编译期生成的各种字面量和符号引用,这些数据都放在运行时常量池

6、直接内存

直接内存并不是虚拟机运行时数据区的一部分

java1.4之后引入的NIO部分,基于管道和缓冲区的I/O方式,可以使用本地方法直接分配对外内存进行操作,这样能在一些场景中显著提高性能,比如零拷贝技术

发布了11 篇原创文章 · 获赞 1 · 访问量 363

猜你喜欢

转载自blog.csdn.net/qq_37421368/article/details/105231077
今日推荐