JVM分为:程序计数器,堆,JAVA虚拟机栈,本地方法栈,方法区。
程序计数器:是一块很小的内存空间,主要做的是当前线程所执行的字节码的行号指示器。通过改变这个计数器的值来选取下一条需要执行的字节码指令。JAVA虚拟机的多线程是通过线程轮流切换并分配处理器执行时间。一个处理器只处理一个线程。因此,为了线程的数据安全,每个线程都需要一个程序计数器。
JAVA虚拟机栈:同样是线程私有的。生命周期和线程一样。存储每个方法的局部变量,操作栈,动态链表,方法出口等信息。
局部变量表存放编译器可知的基本数据类型,对象引用和returnAddress类型。其中long和double占用两个空间。在内存空间在编译器就完成了内存的分配。在方法运行期间,不会改变其空间大小。
本地方法栈:与JAVA虚拟机栈发挥的作用非常相似。
JAVA堆:所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域唯一的目的就是存放对象实例。是垃圾回收的主要区域。
方法区:也是共享的内存区域。用于虚拟机加载的类信息,常量,静态变量,等一些无关具体对象的抽象数据。还有一个名字为永久代。本质上两者不等价。