JVM内存分配
分类:
文章
•
2023-12-19 21:18:40
内存分区
-
方法区
- 方法区主要是用来存储已被虚拟机加载的类的信息、常量、静态变量和即时编译器编译后的代码数据
- 该区域是被线程共享的
- 方法区中有一个运行时常量池,用于存放静态编译产生的字面量和符号引用。该常量池具有动态性,就是说常量并不一定是编译时确定的,运行时产生的常量也会在这个常量池中
- 在该区域内很少发生垃圾回收,在这里的GC主要是对方法区的常量池和对类型的卸载
-
虚拟机栈
- 也就是平时所称之的栈内存,它为Java方法服务,每个方法在执行的时候都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接和方法出口等信息
- 虚拟机栈是线程私有的,它的生命周期和线程相同
- 局部变量表中存储的是基本数据类型、returnAddress(指向一条字节码指令的地址)和对象引用。局部变量表所需内存空间在编译期间确定
- 操作数栈的作用是用来存储运算结果和运算的操作数,它不同于局部变量表通过索引来访问,而是压栈和出栈的方式
- 每个栈帧都包含一个指向运行时常量池中该栈帧所诉方法的引用,持有该引用是为了支持方法调用过程中的动态连接(动态链接就是将符号引用在运行期转换为直接引用)
-
本地方法栈
- 本地方法栈和虚拟机栈类似,但是它是为Native方法服务
-
堆
- java堆内存是所有线程所共享的一块区域,在虚拟机启动时创建,几乎所有对象实例都在这里创建,因此该区域经常发生垃圾回收。
-
程序计数器
- 内存空间小,字节码解释器工作时通过改变这个计数值可以选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理和线程恢复等功能都需要依赖这个计数器完成。该内存区域是唯一一个Java虚拟机规范没有任何OOM情况的区域