程序计数器为每个线程私有指向线程对应程序的当前执行地址指向虚拟机栈中对应栈帧如果执行方法为Native方法程序计数器为null没有OutOfMemory和StackOverflow异常Java虚拟机栈为每个线程私有虚拟机栈的元素为栈帧每个方法在执行时创建一个栈帧因此一对一关系栈帧存储当前方法的局部变量表操作数栈方法出口等信息有StackOverflow和OutOfMemory异常本地方法栈为每个线程私有为Native方法服务每个Native方法执行时创建一个本地方法栈帧来存储局部变量等信息有StackOverflow和OutOfMemory异常Java堆被所有进程共享存放对象实例包括成员变量存放数组存放静态变量堆为垃圾回收GC管理的主要区域根据GC逻辑堆分为 新生代 和 老生代新生代细分 Eden区Survivor区Eden区大多数对象刚出生的地方Survivor区为经历一次或多次GC仍存活的对象的地方老生代为更长生命周期的对象GC会根据各个区域新生代区域的Eden和Survivor老生代区域的占满情况来进行清理在Eden或Survivor占满时会执行MinorGC清理新生代然后存活下来的进行晋升如Eden晋升到SurvivorSurvivor晋升到老生代。在老生代空间不足或元空间空间不足等时会触发MajorGc或FullGC对整个java堆全面清理元空间存储类描述以及类中的成员变量描述成员方法描述运行时常量池创建对象需要元空间对应的类描述有OutOfMemory异常类太多运行时内存区域的联动过程当我们执行以下这行代码时JVM 内部三个区域是如何配合的UserusernewUser();元空间 (Metaspace)JVM 首先检查元空间中是否已经加载了User类。如果没有加载器会把User的结构信息如上述表格内容填入元空间。它是“图纸”JVM 根据元空间里的字段定义算出创建一个User对象需要占多少字节。Java 堆 (Heap)JVM 根据“图纸”计算的大小在堆中分配一块内存。它是“实物”这里存放真正的name张三、age25等数据。虚拟机栈 (Stack)在当前线程的栈帧中局部变量表里存入一个变量user。它是“指针”user的值就是堆中那个User实例的物理内存地址。直接内存操作系统级的本地内存由操作系统管理不属于JVM数据区的一部分