以下这种图有助于理解JVM运行时数据区域的情况
1、每个线程单独拥有的数据区
每个线程单独拥有的数据区包括 程序计数器、JVM栈、和本地方法栈。但一个新的线程创建时他们都将被创建。
程序计数器:用于控制每个线程的每一次执行操作。
JVM栈:JVM栈包含有帧(Frame),将在以下图进行说明。
本地方法栈:用于支持本地方法,如一些非java语言的方法。
2、所有线程共享的数据区域
所有线程共享的数据区是堆和方法区
堆:堆是经常操作的区域。数组以及对象都在此区域中,但JVM启动时,它们将被创建。
方法区:它包含运行时常量池,属性,方法的数据,以及方法、构造方法的代码。
运行时常量池:是class文件中每一个类或接口的常量池表。存放各种常量,包括从只有在编译时才知道的字面量到只有在运行时才能确定的方法以及属性的引用。
栈包含帧,但一个方法被调用时,一个帧将会压入栈中。
一个帧由本地变量数组、操作对象栈,常量池的引用组成。
参考:JVM Specification – Run-Time Data Areas
原文地址:http://www.programcreek.com/2013/04/jvm-run-time-data-areas/