核心的五个部分
虚拟机栈:局部变量中基础类型数据、对象的引用存储的位置,线程独立的。
堆:大量运行时对象都在这个区域存储,线程共享的。
方法区:存储运行时代码、类变量、常量池、构造器等信息,线程共享。
程序计数器:记录程序运行的位置,线程独立的。
本地方法栈:用于JNI本地方法操作的栈,线程独立的。
栈帧包含什么
虚拟机栈存在着一个个栈帧,一个栈帧表示一个被调用的方法,栈帧在方法调用的时候入栈,在方法执行完毕的时候出栈。
局部变量数组,顾名思义就是用于存储方法中的局部变量的,包括入参。其中实例方法的局部变量数组的第一个元素是调用这个方法的实例的引用,入参从第二个参数开始,而静态方法从第一个参数开始。
操作数栈,用于数据操作,例如方法的输入和输出运算,都会使用到操作数栈。
帧数据,存储的是常量池引用、如何方法返回,异常信息等等。
栈和堆数据存储
位置/数据类型 | 基础类型局部变量 | 引用类型局部变量的引用 | 引用类型局部变量的值 | 引用类型中包含的基础类型变量 | 引用类型中包含的引用类型变量的引用 | 引用类型中包含的引用类型变量的值 |
栈 | √ | √ | ||||
堆 | √ | √ | √ | √ |
防止引用溢出
对象的深度copy可以解决溢出问题。