JVM的五大内存区域
JVM内存区域最粗略的划分可以分为 堆 和 栈 ,当然,按照虚拟机规范,可以划分为以下几个区域:
JVM内存分为线程独享区和线程共享区,
其中 方法区 和 堆 是线程共享区,
虚拟机栈, 本地方法栈和程序计数器是线程独享区,为单个线程服务.
1、程序计数器(Program Counter Register) :程序计数器是一块较小的内存区域,它可以看作是当前线程所执行的字节码的行号指示器。每个线程都有自己独立的程序计数器,用于记录当前线程执行的位置,以便线程切换后能够恢复到正确的执行位置。
2、Java虚拟机栈(Java Virtual Machine Stack) :每个线程在执行Java方法时,都会创建一个对应的栈帧(Stack Frame),用于存储局部变量、方法参数、操作数栈和动态链接等信息。栈帧的大小在编译时就确定下来,栈的大小也可以在启动时进行调整。
3、本地方法栈(Native Method Stack):本地方法栈与Java虚拟机栈类似,但是它为本地方法(Native Method)服务。本地方法是使用其他语言(如C、C++)编写的方法,它们与Java代码进行交互,需要独立的栈来支持。
4、Java堆(Java Heap):Java堆是Java虚拟机管理的最大一块内存区域,用于存储对象实例和数组。Java堆是所有线程共享的,它在JVM启动时被创建,并且在运行时进行动态扩展或收缩。垃圾回收器负责在堆上进行垃圾回收,以释放不再使用的对象。Java堆是垃圾收集器管理的内存区域,因此一些资料中它也被称作“GC堆”(Garbage Collected Heap,)。从回收内存的角度看,由于现代垃圾收集器大部分都是基于分代收集理论设计的,所以Java堆中经常会出现 新生代 、 老年代 、Eden空间 、 From Survivor空间 、 To Survivor空间 等名词,需要注意的是这种划分只是根据垃圾回收机制来进行的划分,不是Java虚拟机规范本身制定的。
5、方法区(Method Area):方法区也称为永久代(Permanent Generation),用于存储已加载的类信息、常量、静态变量、即时编译器编译后的代码等。在JDK 8及之后的版本中,永久代被移除,取而代之的是元空间(Metaspace),它使用本地内存来存储类的元数据