background image

被压入到栈中,A 方法又调用了 B 方法,于是产生栈帧 F2 也被压入栈,执行完毕后,

先弹出 F2

栈帧,再弹出 F1 

栈帧,遵循 先进后出 原则。

那 栈 帧 中 到 底 存 在 着 什 么 数 据 呢 ? 栈 帧 中 主 要 保 存 3  类数据:本地变量( Local 
Variables),

包括输入参数和输出参数以及方法内的变量;栈操作(Operand Stack),记录出栈、

入栈的操作;

栈帧数据(Frame Data),包括类文件、方法等等。光说比较枯燥,我们画个图来理

解一下 Java

栈,如下图所示:
慢慢琢磨 JVM

图示在一个栈中有两个栈帧,栈帧 2 是最先被调用的方法,先入栈,然后方法 2 又调用

了方法
1,栈帧 1 处于栈顶的位置,栈帧 2 处于栈底,执行完毕后,依次弹出栈帧 1 和栈帧
2,线程结束,

栈释放。
_ Heap 堆内存

一个 JVM 实例只存在一个堆类存,堆内存的大小是可以调节的。类加载器读取了类文件

后,需

要把类、方法、常变量放到堆内存中,以方便执行器执行,堆内存分为三部分:
Permanent Space 永久存储区

慢慢琢磨 JVM

永久存储区是一个常驻内存区域,用于存放 JDK 自身所携带的 Class,Interface 的元数

据,也
就是说它存储的是运行环境必须的类信息,被装载进此区域的数据是不会被垃圾回收器

回收掉的,
关闭 JVM 才会释放此区域所占用的内存。

Young Generation Space 新生区

新生区是类的诞生、成长、消亡的区域,一个类在这里产生,应用,最后被垃圾回收器

收集,

 

结束生命。新生区又分为两部分: 伊甸区( Eden space)和幸存者区(Survivor 

pace),所有的

类都是在伊甸区被 new 

 

出来的。幸存区有两个: 0 区(Survivor 0 space)和 1 区

(Survivor 1 space)。

当伊甸园的空间用完时,程序又需要创建对象,JVM 的垃圾回收器将对伊甸园区进行垃

圾回收,将
伊甸园区中的不再被其他对象所引用的对象进行销毁。然后将伊甸园中的剩余对象移动

到幸存 0

区。若幸存 0 区也满了,再对该区进行垃圾回收,然后移动到 1 区。那如果 1 区也满了

呢?再移动
到养老区。
Tenure generation space 养老区

养老区用于保存从新生区筛选出来的 JAVA 

 

对象,一般池对象都在这个区域活跃。 三个

区的
示意图如下:
_ Method Area 方法区

方法区是被所有线程共享,该区域保存所有字段和方法字节码,以及一些特殊方法如构

造函数,
接口代码也在此定义。
_ PC Register 程序计数器

每个线程都有一个程序计数器,就是一个指针,指向方法区中的方法字节码,由执行引

擎读取
下一条指令。

慢慢琢磨 JVM
_ Native Method Stack 本地方法栈