三、本地方法栈
本地方法栈和上面介绍的虚拟栈基本相同,只不过是针对本地(native
)方法。在开发中如果涉及 JNI
可能接触本地方法栈多一些,在有些虚拟机的实现中已经将两个合二为一了(比如HotSpot)。
四、堆
Java 堆(Heap
)是 JVM 所管理的内存中最大的一块,该区域唯一目的就是存放对象实例,几乎所有对象的实例都在堆里面分配,因此它也是 Java 垃圾收集器(GC)管理的主要区域,有时候也叫作“GC 堆”。同时它也是所有线程共享的内存区域,因此被分配在此区域的对象如果被多个线程访问的话,需要考虑线程安全问题。
按照对象存储时间的不同,堆中的内存可以划分为新生代(Young)
和老年代(Old)
,其中新生代又被划分为 Eden
和 Survivor
区。具体如下图所示:
五、方法区
方法区(Method Area
)主要是存储已经被 JVM
加载的类信息(版本、字段、方法、接口)、常量、静态变量、即时编译器编译后的代码和数据。该区域同堆一样,也是被各个线程共享的内存区域。
注意:关于方法区,很多开发者会将其跟“永久区”混淆。
-
方法区是规范层面的东西,规定了这一个区域要存放哪些数据。
-
永久区或者是
metaspace
是对方法区的不同实现,是实现层面的东西。
六、异常再现
- StackOverflowError 栈溢出异常
递归调用是造成 StackOverflowError