jvm内存分为5个部分,有程序计数器,java虚拟机栈、本地方法栈、java堆和方法区。其中程序计数器、java虚拟机栈和本地方法栈是线程私有的。java堆和方法区是程序共享的。
程序计数器:(私有)
a.可以看作是当前执行字节码的行号指示器。
b.每个线程都有独立的程序计数器,各线程的程序计数器互不影响,独立存储。(为了程序切换后能回复到正确的位置)
c.当执行java方法时,记录的是正在执行的jvm字节码的地址。若执行native 方法,计数器为空。
d.jvm中唯一一个没有规定outofmemoryError的区域。
java虚拟机栈:(线程私有)
a.线程私有,声明周期与线程相同
b.每一个方法执行的同时创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法的执行和退出对应着栈帧在虚拟机栈中的入栈和出栈过程。
c.局部变量表:存放编译器可知的各种基本数据类型、对象引用类型和returnAddress类(指向字节码指令的地址:函数返回地址)。局部变量表需要的内存空间在编译期是可以确定下来的。
本地方法栈:(线程私有)
a.为native 方法提供服务
java堆
a.jvm中所管理内存中最大的一块,在虚拟机启动时创建。
b.存放对象实例,几乎所有的对象实例和数组都是这里分配内存。
c.堆是垃圾收集管理的主要区域,也称为gc堆。
方法区(线程共享):
a.用于存储虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码
b.这个区域内存回收针对常量池的回收和对类的卸载。
c.方法区也可以被垃圾收集
运行时常量池:它是方法区的一部分,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载器后进入方法区进入运行时常量池。