Java内存模型
公共区域
堆
堆是JVM中共享的内存区域,那堆存放什么呢?
- 对象实例。比如Object o = new Object(); new出来的对象就是存放在堆中
- 数组
方法区
- 方法区(Method Area) 与 Java 堆一样,是各个线程共享的内存区域。
- 方法区在 JVM 启动的时候创建,并且它的实际的物理内存空间和 Java 堆区一样都可以是不连续的。
- 方法区的大小,跟堆空间一样,可以选择固定大小或者可扩展。
- 方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区的溢出,虚拟机同样会抛出内存溢出错误: java.lang.OutOfMemoryError:PermGen space 或者 java.lang.OutOfMemoryError:Metaspace
- 关闭 JVM 就会释放这个内存区域
线程私有区域
栈
栈因为是运行单位,因此里面存储的信息都是跟当前线程相关的信息。包括:局部变量(含形参)、程序运行状态、方法返回值等等
例如:
- main
方法开始执行:int date = 9;
date:局部变量,基础类型,引用和值都存在栈中。
- Test test = new Test();
test:为对象引用,存在栈中,对象(new Test())存在堆中。
- test.change(date);
调用change(int i)方法,i为局部变量,引用和值存在栈中。当方法change执行完成后,i就会从栈中消失。
本地方法栈
存放执行native(c++函数)本地方法时产生的信息
程序计数器
存放的是当前线程执行到哪一条指令,假如当前线程阻塞,进行上下文切换时,切换回当前线程就是靠程序计数器知道当前线程执行到哪一条指令