JVM 内存分区
线程私有区(生命区域与用户线程强相关)
- Java虚拟机栈
- 本地方法栈
- 程序计数器
线程共享区域(生命周期与JVM进程强相关)
- 堆
- 方法区
- 运行时常量池
分区详述
线程私有区域
程序计数器
- 程序计数器是一块很小的内存空间,可看作是当前进程所执行的字节码行号指示器,存放指令,记录当前进程走到哪
- 程序计数器是 JVM 运行时区域唯一一块不会放出 OOM(OutOfMemoryError)区域
- 线程私有:在单核处理器中,JVM 线程是通过线程轮流切换并分配处理器执行时间 的方式实现,在某个时刻只有一个线程运行在 CPU 上;每个线程独有的区域互不影响,独立存储,叫做线程私有空间
Java虚拟机栈
- Java虚拟机栈描述的是Java方法的内存模型,生命周期与线程相同,和线程强相关
- Java方法执行的同时会在虚拟机栈中开辟栈帧,用来存放局部变量表,操作数栈,动态链接,方法出口等信息;每一个方法的调用和执行结束,对应着栈帧的入栈和出栈的过程
- 局部变量表(所需内存在编译期间分配,执行期间不会改变局部变量表的大小):存放编译期间可知的各种基本数据类型(8大数据类型)、对象的引用
- Java虚拟机栈一种会出现两种异常:
- StackOverFlowError 栈溢出:线程请求的栈的深度大于虚拟机允许的深度
- OOM 异常:虚拟机栈在动态扩展时无法申请到足够的内存抛出的OOM
本地方法栈
- 本地方法栈和Java虚拟机栈的作用完全相同,只不过本地方法栈为native方法服务,而虚拟机栈为Java方法服务
线程共享区域
堆
- 堆是 JVM 管理的最大内存区域,线程共享,在 JVM 进程启动时创建,所有的对象实例与数组都在堆上分配
- 堆是垃圾回收器管理的主要内存区域;如果堆中没有足够的内存完成实例分配,并且无法再扩展时,抛出 OOM
方法区(也会产生 OOM )
- 存储被虚拟机加载的类的信息,常量,静态变量,方法等数据
常量池
- 主要用来存放字符串常量