0.JVM运行时数据模型
Java 虚拟机的内存模型分为两部分:一部分是线程共享的,包括 Java 堆和方法区;另一部分是线程私有的,包括虚拟机栈和本地方法栈,以及程序计数器这一小部分内存。
1.程序计数器和本地方法栈
程序计数器和程序计数器比较简单,放在一块讲。
1.1 程序计数器是一块小的内存空间,线程私有的。
可以看做是当前线程所执行的字节码的行号指示器。每一个线程都有自己程序计数器。
如果线程正在执行的是一个Java方法,程序计数器的值就是正在执行的虚拟机字节码指令的地址;如果线程正在执行的是Native方法,这个程序计数器的值为空(undefined)。此内存区域是虚拟机规范中没有规定任何OutOfMemoryError情况的区域。
1.2 本地方法栈
本地方法栈与虚拟机栈所发挥的作用是非常相似的,它们之间的区别不过是:
虚拟机栈为虚拟机执行java方法,而本地栈则为虚拟机使用到的Native方法服务。Native方法是用C++实现的,在Java中以接口的方式存在,并以native修饰。
2.虚拟机栈的工作原理
虚拟机栈在Java方法被调用时起作用,虚拟机栈的栈元素是栈帧。每当一个Java方法执行时,方法对应的栈帧入栈;执行完毕后,对应栈帧出栈。栈帧有4个部分组成,局部