01 JVM内存

java文件编译生成class文件,通过class loader加载到内存中,jvm内存区域可分为方法区、堆区、虚拟机栈、本地方法栈、程序计数器,不同的区域有各自的作用,这些分区是指JVM的规范,具体实现层面可有不同。

在这些分区中,虚拟机栈、本地方法栈、程序计数器是线程私有的,随着线程的结束而释放。方法区以及堆区是线程共享的,因此存在线程安全问题,堆加载对象,是gc主要管理区域。

方法区

加载类信息(方法、版本、字段、方法、接口),静态变量,常量。

堆区

存档对象实例,是最大一块内存,也是垃圾收集器管理的主要区域。根据对象生存周期的不同,堆区分为新生代以及老年代,不同的区域垃圾回收频率及算法不同,用以提高垃圾回收效率,即为分代回收。

虚拟机栈

虚拟机栈是用以存储函数(方法)执行过程中的数据。一个线程没执行一个方法,都会创建一个栈帧,每个栈帧分为局部变量表、操作数栈、动态链接、返回地址;

局部变量表存储该方法用到的变量

操作数栈是一个后入先出栈,用于存贮执行数据。例如代码int a = 10;在编译执行的时候,会把10入栈,只有把10复制局部变量表中的a。

动态链接支持方法的动态链接,指向方法区常量池中,该栈帧对应的方法符号引用。例如方法methodA调用方法methodB,methodB对应的栈帧持有“methodB”的引用,methodB会替换为该栈帧地址

返回地址,保存方法执行完毕后,返回的上个函数的地址。

本地方法栈

类似虚拟机栈,执行本地方法

程序计数器

存储对应线程执行位置,如线程挂起,记录线程执行位置

你可能感兴趣的:(01 JVM内存)