Java虚拟机主要包含⼏个区域:
堆:堆Java虚拟机中最⼤的⼀块内存,是线程共享的内存区域,基本上所有的对象实例数组都是在堆上
分配空间。堆区细分为Yound区年轻代和Old区⽼年代,其中年轻代⼜分为Eden、S0、S1 3个部分,他
们默认的⽐例是8:1:1的⼤⼩。
栈:栈是线程私有的内存区域,每个⽅法执⾏的时候都会在栈创建⼀个栈帧,⽅法的调⽤过程就对应着
栈的⼊栈和出栈的过程。每个栈帧的结构⼜包含局部变量表、操作数栈、动态连接、⽅法返回地址。
局部变量表⽤于存储⽅法参数和局部变量。当第⼀个⽅法被调⽤的时候,他的参数会被传递⾄从0开始的
连续的局部变量表中。
操作数栈⽤于⼀些字节码指令从局部变量表中传递⾄操作数栈,也⽤来准备⽅法调⽤的参数以及接收⽅
法返回结果。
动态连接⽤于将符号引⽤表示的⽅法转换为实际⽅法的直接引⽤。
元数据:在Java1.7之前,包含⽅法区的概念,常量池就存在于⽅法区(永久代)中,⽽⽅法区本身是⼀
个逻辑上的概念,在1.7之后则是把常量池移到了堆内,1.8之后移出了永久代的概念(⽅法区的概念仍然
保留),实现⽅式则是现在的元数据。它包含类的元信息和运⾏时常量池。
Class⽂件就是类和接⼝的定义信息。
运⾏时常量池就是类和接⼝的常量池运⾏时的表现形式。
本地⽅法栈:主要⽤于执⾏本地native⽅法的区域
程序计数器:也是线程私有的区域,⽤于记录当前线程下虚拟机正在执⾏的字节码的指令地址