JVM虚拟内存结构可以分为公有和私有两部分.
公有部分内存
公有指所有线程共享的部分: Java堆,方法区,常量池
Java堆
用于Java实例对象的内存分配的区域.几乎所有的实例对象都会在这里进行内存分配(栈上分配)
Java 堆根据对象存活时间的不同,Java 堆还被分为年轻代、老年代两个区域,年轻代还被进一步划分为 Eden 区、From Survivor 0、To Survivor 1 区
当有对象需要分配时,一个对象永远优先被分配在年轻代的 Eden 区,等到 Eden 区域内存不够时,Java 虚拟机会启动垃圾回收。此时 Eden 区中没有被引用的对象的内存就会被回收,而一些存活时间较长的对象则会进入到老年代。在 JVM 中有一个名为 -XX:MaxTenuringThreshold
的参数专门用来设置晋升到老年代所需要经历的 GC 次数,即在年轻代的对象经过了指定次数的 GC 后,将在下次 GC 时进入老年代
默认的虚拟机配置,Eden:from :to = 8:1:1
方法区
存储Java类字节码数据的一块区域,存储了每个类的结构信息: 运行时常量池,字段和方法数据,构造方法等.
方法区在不同版本的虚拟机有不同的表现形式,例如在 1.7 版本的 HotSpot 虚拟机中,方法区被称为永久代(Permanent Space),而在 JDK 1.8 中则被称之为 MetaSpace
私有部分内存
线程私有部分可以分为:PC 寄存器、Java 虚拟机栈、本地方法栈三大部分
PC 寄存器,顾名思义 Program Counter 寄存器,指的是保存线程当前正在执行的方法。如果这个方法不是 native 方法,那么 PC 寄存器就保存 Java 虚拟机正在执行的字节码指令地址。如果是 native 方法,那么 PC 寄存器保存的值是 undefined。任意时刻,一条 Java 虚拟机线程只会执行一个方法的代码,而这个被线程执行的方法称为该线程的当前方法,其地址被存在 PC 寄存器中。
Java 虚拟机栈,这个栈与线程同时创建,用来存储栈帧,即存储局部变量与一些过程结果的地方。栈帧存储的数据包括:局部变量表、操作数栈。
文章链接 https://fangzongzhou.github.io/2020/11/10/计算机/技术栈/Java/JVM/JVM内存结构/