先上图:
jvm模型图
基于这张图,可以这样回答:
jvm的内存模型包含线程共享的方法区和堆,以及线程私有的虚拟机栈、本地方法栈和程序计数器
方法区:线程共享,用来存储已被虚拟机加载的类信息、常量、静态变量、JIT(just in time,即时编译技术)编译后的代码等数据。运行时常量池是方法区的一部分,用于存放编译期间生成的各种字面常量和符号引用。
堆:线程共享,OOM故障最主要的发源地,存储着几乎所有的实例对象,堆由垃圾收集器自动回收;通过参数-Xms设定初始值、-Xmx设定最大值。
本地方法栈:线程私有,为虚拟机使用到的Native方法服务。本地方法栈也会抛出StackOverflowError和OutOfMemoryError异常。
虚拟机栈:线程私有。它描述的是java方法执行的内存模型,每个方法执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
程序计数器(Program Counter Register):线程私有,每个线程独立拥有一个程序计数器,在CPU进行上下文切到本线程后,通过该计数器正确找到要继续执行的位置,是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在此内存区域是唯一一个在JVM规范中没有规定任何OutOfMemoryError情况的区域。