从四则运算认识JVM内存模型

首先,在main()方法里面定义了y、x、d等变量,而在math()方法里面对传入变量作对应的四则运算(这里采用"+"、"x"),计算值并return返回main()方法。

于是,采用对其生成相应的字节码分析可得:

 

从四则运算认识JVM内存模型_第1张图片

由图可知,在方法里面定义的局部变量都有其对应的归属地<局部变量表>,先进后出。程序计数器可以看作是当前线程所执行的字节码的行号指示器<分支、循环、跳转、异常处理、线程恢复等基础功能都依赖计数器finished>,若线程正在执行的是一个Java方法,则记录的是正在执行的虚拟机字节码指令的地址,若为Native方法,则计数器值为null(Undefined),此内存区域是唯一一个在Java虚拟机规范中没有规定任何oom情况的区域。与程序计数器一样,Java虚拟机栈也是线程私有的,它的生命周期与线程相同,描述的是Java方法执行的内存模型,每个方法在执行时会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等,在调用math()方法并return<出口>的地方,也有其相应的归属等等。

Java虚拟机规范对Java虚拟机栈规定了俩种异常情况:若线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;若可动态扩展,而无法可申请到足够的内存,将抛出OutOfMemoryError异常。<本地方法栈也同样会抛出>。

当在没有被引用的时候,通过GC机制回收,如有则从Eden到From到To过渡最终到老年代,这时候就会full gc出现oom<提示内存已耗尽>。

SoS:堆的内存管理尤为关键,那就让我们再一起去认识GC·?yxd179哟?

你可能感兴趣的:(架构与源码分析,JVM,JVM内存模型)