参考《深入JAVA虚拟机》、《JAVA多线程设计模式》等书。 方法区:存储当前JVM实例的类型信息和静态变量,这些信息是由该实例的所有线程共享的。 堆:存储JVM运行过程中创建的对象信息。 Java栈:每启动一个线程,JVM会为该线程分配一个JAVA栈,该栈保存当前线程的函数调用状态,包括其局部变量,传递进函数的参数等信息。 PC寄存器:通JAVA栈一样,也是在新线程创建的时候分配,总是指向下一个要执行的函数(非本地方法)。 本地方法栈:存储本地方法的调用状态、参数、变量以及与具体实现相关的下一个函数执行地址。 JVM实例:当JVM启动一个JAVA程序时,即创建一个JVM实例。每个实例都有独立的方法区和堆,并且他们是由当前实例里所有线程共享的。
总结来说,独享的内存区域可总结为: JVM -- 本地方法栈 JVM实例 -- 方法区和堆 JVM线程 -- JAVA栈和PC寄存器
其他观点: 在《JAVA多线程设计模式》一书中,又把JVM实例的内存模型分为“主存储器(Mail Memory)”和“工作存储器(Working Memory)” 相对应于《深入JAVA虚拟机》中的概念,主存储器应该是指该JVM可用的所有内存空间,工作存储器是主存储器中的一个部分。
当线程需要访问某一个字段的时候,会首先将该字段从主存储器拷贝到工作存储器中(即将数据从方法区拷贝至JAVA栈)。 当线程需要保存某个数据的时候,也无法直接存储于主存储器,而是需要先保存至工作存储器中,等到JVM调度映射至主存储器。 |
联系客服