Java 内存主要分为以下几个区域:
1. 虚拟机栈:
线程私有,由一个个栈帧组成,每个栈帧包含以下数据结构
a. 本地变量表 b. 操作数栈 c. 动态链接 d. 返回地址
本地变量表和操作数栈配合使用,支持方法调用。局部变量表分为一个个solt,Java解释器会根据指令对数据进行压栈,然后出栈,存入局部变量表或操作(计算),然后再入栈,再出栈等过程。
会出现两种内存溢出的情况:1) 递归调用 java.lang.StackOverflowError;2) 太多的线程造成无法分配栈空间 OOM。
2. 堆:
存储新建的对象
3. 元数据区:
存放Class,常量,静态变量
4. 本地方法栈:
用于支持本地方法调用
5. 程序计数器:
线程私有,记录当前方法执行的行号,用于在线程被重新唤醒时获取上次执行的位置。