一、JVM运行时数据区
- 数据共享区
- 方法区 Method Area(运行时常量池(1.8以后存在于堆中))
- 堆 Heap
- 数据私有区
- 虚拟机栈 VM Stack ---->栈帧(局部变量表,操作数栈,动态链接,返回地址)
- 本地方法栈 Native Method Stack
- 程序计数器 Program Counter Register
二、数据共享区
1、方法区
①存储每一个类的结构信息。比如:运行时常量池,字段,方法数据,构造函数和普通方法的字节码内容;还包括一些 类、实例、接口初始化时用到的特殊方法。
②基本信息包括:每个类的全限定名,每个类的直接超类的全限定名,该类的访问修饰符,直接超接口的全限定名的有序列表。
③每个已装载类的详细信息包括:运行时常量池、字段信息、方法信息、静态变量、到类的classloader的引用、到类class的引用。
/*****常量池******/-------------->数据编译期间被确定,是Class文件中的一部分,存贮了类,方法,接口等中的常量,包括字符串常量。
/*****字符串池/字符串常量池*****/--->是常量池的一部分,存储编译期间类中产生的字符串类型数据
/*****运行时常量池*****/---------->方法区的一部分。虚拟机加载Class后把常量池中的数据放入到运行时常量池。
2、堆
存在的唯一目的就是:存放对象实例。几乎所有的对象实例都在这里分配内存。也是垃圾回收的主要区域。
*从垃圾回收角度分为:新生代、老年代;Eden空间和FromSurvivor,ToSurvivor空间。
三、非共享区
1、虚拟机栈
它描述的是Java方法执行的内存模型:方法被执行的同时会创建一个栈帧,用于存放局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法从调用到执行,就对应着一个栈帧在虚拟机中由入栈到出栈的过程。
2、本地方法栈
与虚拟机栈发挥的作用类似,区别是本地方法栈为虚拟机使用到的Native方法服务,通过Java本地接口JNI来调用其他语言编写的程序
3、程序计数器
指向当前线程执行字节码的行号指示器。1)若执行Java方法,则指向的是正在执行的虚拟机字节码的地址。
2)若执行本地方法,则计数器为空。