JVM 包含两个子系统和两个组件。两个子系统分别是ClassLoader和ExecutionEngine,两个组件则是Runtime Data Area和Native Interface,其中Runtime Data Area中就包含了我们常说的JVM内存。
但仅仅将内存分成这么一大块,JVM是啥也干不了的。为此Runtime Data Area中又将内存划分成不同的区域,用于存储不同的数据。
Method Area——方法区,被Class Loader所装载的class文件以及相关的方法信息、域信息、静态变量等都存放在这个区域内。该区域是所有Java线程所共享的。
Heap——堆区,这个区域就是用来存放java对象的,通常GC也是针对该区域。一个Java虚拟机实例只有一个堆,并直接由java虚拟机进行管理,在虚拟机启动时创建。该区域可以被所有Java线程所共享。
Stack——栈区,用来存放JVM的内存指令。通常虚拟机对它的操作比较简单(以帧为单位的压栈和出栈),速度也很快。每个线程都有自己的栈,且栈可以不连续。
Program Counter Register——每一个线程都有自己的一个PC寄存器,用于存放下一条被执行的指令的地址。每个线程的PC寄存器在线程启动时产生。
Native Method Stack——保存本地方法进入区域的地址。
通常来说,也可以将JVM的内存区域划为堆和非堆两个区域。堆即上面的Heap区域,剩下的都是非堆区域。而jvm 对内存垃圾的回收,即GC,通常都是针对堆区域的。