通常谈到JVM的内存模型,一般人会想到堆和栈等,那么堆和栈如何理解呢?
栈是运行时的单位;
堆是存储的单位。
通俗来说栈解决的是程序如何运行,数据如何处理的问题;而堆解决的是数据如何存储,存储在哪的问题。
JMM
如上图所示,java虚拟机内存模型主要分为以上五个部分,这里以java8为学习对象。
一、本地方法栈 (Native Method Stacks)
本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的。其区别在于虚拟机栈为虚拟机执行Java方法所服务,而本地方法栈则是为虚拟机使用到的native方法所服务。
本地方法栈也是一个私有(线程私有)的内存区域,也是后进先出。
虚拟机可以自由实现它,有的虚拟机(如HotSpot虚拟机)直接就把本地方法栈和虚拟机栈合二为一。
本地方法栈区域也会抛出StackOverflowError和OutOfMemoryError异常:
二、虚拟机栈 (Java Virtual Machine Stacks)
每个Java线程都有一个私有Java虚拟机栈,与该线程同时创建。
在虚拟机栈内,每个方法会生成一个栈帧。每个栈帧代表一次次的方法调用,一个方法的执行到执行完成的过程,代表栈帧从入栈到出栈的过程。
虚拟机栈会抛出StackOverflowError和OutOfMemoryError。
2.1 栈帧结构
下图表示了栈帧的