运行时数据区域
1、程序计数器
Java虚拟机的多线程是通过线程轮流切换、分配处理器执行时间的方式来实现的,在任何一个确定是时刻,一个处理器(对于多核处理器来说都是一个内核)都只会执行一条线程中的指令。
所以为了线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,这类内存区域称为”线程私有内存“。
2、Java虚拟机栈
“线程私有”且生命周期与线程相同。
虚拟机栈描述的是Java方法执行的线程内存模型:每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机中从入栈到出栈的过程。
3、本地方法栈
与虚拟机栈所发挥的作用是相似的,区别是虚拟机栈为虚拟机执行Java方法(字节码)服务,而本地方法栈则是为虚拟机使用到本地(Native)方法服务。
4、Java堆
是虚拟机所管理的内存中最大的一块,被所有线程共享的一块区域,在虚拟机启动时创建,唯一目的是存放对象实例。
Java堆是垃圾收集器管理的内存区域。
Java堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续。
5、方法区
与Java堆相似,是线程共享的内存区域,不过是用于存储被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。
方法区无法满足新的内存分配需求时,将抛出OutOfMemoryError异常。
6、运行时常量池
它是方法区的一部分。Class文件中有常量池表,用于存放编译器生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。
收到方法区内存的限制,当常量池无法再申请到内存时会抛出OutOfMemoryError异常。
原文:https://www.cnblogs.com/codercql/p/13435653.html