Java内存结构(6大内存结构组成详解)

Java内存结构(6大内存结构组成详解)-mikechen

程序计数器

  1. 程序计数器是一块较小的空间,它可以看做是当前线程所执行的字节码的行号指示器;
  2. 如果线程执行的是java方法,这个计数器记录的是正在执行虚拟机字节码指令的地址,如果正在执行的是native方法这个计数器的值为undefined;
  3. JVM的多线程是通过线程轮流切换并分配CPU执行时间片的方式来实现的,任何一个时刻,一个CPU都只会执行一条线程中的指令。为了保证线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程间的程序计数器独立存储,互不影响;
  4. 此区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域,因为程序计数器是由虚拟机内部维护的,不需要开发者进行操作

虚拟机栈

  1. 每个线程有一个私有的栈,随着线程的创建而创建,生命周期与线程相同
  2. 虚拟机栈里面存着的是一种叫“栈帧”的东西,每个方法会创建一个栈帧,栈帧中存放了局部变量表、操作数栈、动态链接、方法出口等信息。
  3. 局部变量表存放了编译期可知的各种基本数据类型和对象引用类型。通常我们所说的“栈内存”指的就是局部变量表这一部分。
  4. 64位的long和double类型的数据会占用2个局部变量空间,其余的数据类型只占用1个。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧分配多少内存是固定的,运行期间不会改变局部变量表的大小。
  5. 方法的调用到执行完毕,对应的就是栈帧的入栈和出栈的过程。
  6. 栈的大小可以固定也可以动态扩展。
在固定大小的情况下,当栈调用深度大于JVM所允许的范围,会抛出StackOverflowError异常。
在动态扩展的情况下,若扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常

本地方法栈

  1. 和虚拟机栈类似,两者的区别就是虚拟机栈是为虚拟机执行java方法服务,本地方法栈为虚拟机执行native方法服务 。
  2. HotSpot虚拟机不区分虚拟机栈和本地方法栈,两者是一块的。
  3. 与虚拟机栈一样,本地方法栈也会抛StackOverflowError和OutOfMemoryError异常。

  1. JVM管理的最大的一块内存区域,存放着对象的实例,是线程共享区。
  2. 堆是垃圾收集器管理的主要区域,因此也被称为“GC堆”
  3. JAVA堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。
  4. 可通过参数 -Xmx -Xms 来指定运行时堆内存的大小,堆内存空间不足也会抛OutOfMemoryError异常
  5. JAVA堆的分类:
从内存回收的角度上看,可分为新生代(Eden空间,From Survivor空间、To Survivor空间)及老年代(Tenured Gen)
从内存分配的角度上看,为了解决分配内存时的线程安全性问题,线程共享的JAVA堆中可能划分出多个线程私有的分配缓冲区(TLAB)

方法区

  1. 方法区也是线程共享区,用于存储【虚拟机加载的类信息(类的版本、字段、方法、接口),常量,静态变量,即时编译器编译后的代码等数据】
  2. 方法区逻辑上属于堆的一部分,但是为了与堆进行区分,通常又叫“非堆”。
  3. HotSpot虚拟机使用永久代来实现方法区,使得HotSpot虚拟机的垃圾收集器可以像管理堆内存一样来管理这部分内存,能省去专门为方法区编写内存管理代码工作。所以开发者喜欢将方法区称为永久代,本质上两者并不等价,对于其他虚拟机来说不存在永久代的概念。
  4. 方法区可选择不实现垃圾收集,一般来说,这个区域对内存回收的条件较为苛刻,但是这部分区域的回收确实是必要的。
  5. 当方法区无法满足内存分配需求时,将会抛OutOfMemoryError异常

运行时常量池

  1. 运行时常量池是方法区的一部分。
  2. class文件除了有类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后加入方法区的运行时常量池中存放。
  3. 运行时常量池相于class文件中的常量池所不同的是其具备了动态性。class文件中常量池中的常量在编译期间就已经定义好了,而运行时常量池在程序运行期间也可以将常量放入该常量池中,最常见的做法就是调用String类的intern()方法

mikechen睿哥

mikechen睿哥,十余年BAT架构经验,资深技术专家,就职于阿里、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法