1.程序计数器 PC Register
每个线程都有一个程序计算器,就是一个指针,指向方法区中的方法字节码(下一个将要执行的指令代码),由执行引擎读取下一条指令,是一个非常小的内存空间,几乎可以忽略不记。
2.本地方法栈 Native Method Stack
本地方法栈与虚拟机栈基本类似,区别在于虚拟机栈为虚拟机执行的java方法服务,而本地方法栈则是为Native方法服务
3.方法区 Method Area
用于存储虚拟机加载的:静态变量+常量+类信息+运行时常量池 (类信息:类的版本、字段、方法、接口、构造函数等描述信息 )
默认最小值为16MB,最大值为64MB,可以通过-XX:PermSize 和
-XX:MaxPermSize 参数限制方法区的大小
4.栈 JVM Stack
- 编译器可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(引用指针,并非对象本身)
- 栈是java 方法执行的内存模型:
每个方法被执行的时候 都会创建一个“栈帧”用于存储局部变量表(包括参数)、操作栈、方法出口等信息。
每个方法被调用到执行完的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
5.堆 Java Heap
- 所有的对象实例以及数组都要在堆上分配,此内存区域的唯一目的就是存放对象实例
- 堆是Java 虚拟机所管理的内存中最大的一块。Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建
- 结构:新生代(Eden区+2个Survivor区) 老年代 永久代(HotSpot有)