Java内存区域是指JVM运行时将数据分区域存储,简单的说就是不同的数据放在不同的地方,因此又叫“运行时数据区域”。
(1)方法区(公有):又称Non-Heap(非堆),主要用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。根据Java 虚拟机规范的规定,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError 异常。
(2)运行时常量池:它是方法区的一部分,主要用于存放编译器生成的各种字面量和符号引用,这些内容将在类加载后存放到运行时常量池中,以便后续使用。
(3)Java堆(公有):也是属于线程共享的内存区域,对于Java应用程序来说,它是虚拟机所管理的内存中最大的一块区域,Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存存在的唯一目的就是存放对象实例,几乎所有的对象实例都在堆上分配空间、存放。
(4)虚拟机栈(线程私有):线程同时创建,总数与线程关联,代表Java方法执行的内存模型。每个方法执行时都会创建一个栈桢来存储方法的的变量表、操作数栈、动态链接方法、返回值、返回地址等信息。
(5)程序计数器(线程私有):属于线程私有的数据区域,是一小块内存空间,主要代表当前线程所执行的字节码行号指示器。字节码解释器工作时,通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
(6)本地方法栈(线程私有):主要与虚拟机用到的Native方法相关,是为虚拟机使用到的本地(Native)方法服务。对应本地方法栈的实现,《Java虚拟机规范》中并未强制规定,由虚拟机自己根据需求实现,有的Java虚拟机例如Hot-Spot虚拟机就直接将本地方法栈和虚拟机栈合二为一。