运行时数据区是把所管理的内存划分为若干不同的数据区域。这区域各有各的用途以及生命周期(各司其职)。
运行时数据区域包含:程序计数器、Java虚拟机栈、本地方法栈、堆内存、方法区。

主要用于存储下一条指令的地址。
问1:使用程序计数器存储字节码指令地址有什么作用?
为了记录不同线程执行的位置(状态)等
问2:为什么使用程序计数器记录当前线程的执行地址?
因为CPU中的线程需要不停的切换,所以就为下一次进入CPU做好记录,以便下次更快的找到之前执行的位置。
问3:程序计数器为什么被设定为私有的?
因为每一个线程在切换出CPU时所执行的位置不同。
栈主要解决程序的运行问题,即程序如何执行,或者说如何处理数据。
每个线程在创建时都会创建一个虚拟机栈,在线程上正在执行的每个方法都各自对应一个栈帧,即对应着一次方法的调用(栈中的数据都以栈帧为单位存储)。
问1:为什么是栈存储而不是寄存器存储?
基于栈的指令在设计和实现更为简单,适用于资源受限的系统。
- 优点:①不需要硬件支持,可移植性好,更好的实现跨平台②指令集小,编译器容易实现
- 缺点:性能低,完成相同操作需要更过的指令集
基于寄存器的指令在设计和实现完全依赖硬件。
- 优点:①性能好,执行效率高②完成操作使用的指令更少
- 缺点:可移植性差
综上所述,由于Java语言是夸平台语言所以Java指令集都是按照栈来设计的。
问1:Java虚拟机栈和本地方法栈的异同点有哪些?
- 相同:都是线程私有的、都有内存溢出
- 区别:Java 虚拟机栈管理 java 方法的调用;而本地方法栈用于管理本地方法的调用,本地方法是用c语言写的。
堆内存主要是解决数据存储问题,“即数据怎么放,放在哪儿”,占用空间最大,用于存放实例对象。
Java8后堆内存被分为:新生区和老年区
新生区又分为:Eden(伊甸园)和Survivor(幸存者),伊甸园:幸存者0:幸存者1 = 8:1:1
问1:堆内存为什么要分区?
把不同生命周期的对象存储在不同区域,这样不同的区域可以使用不同的垃圾回收算法,从而提高垃圾回收的效率。
问2:垃圾回收算法有哪些,且之间有什么区别?
垃圾回收算法有按照回收区域分为:部分收集和整堆收集。
- 部分收集:新生区收集(Minor GC/Yong GC)只有新生区(Eden,S0,S1)的垃圾收集;老年区收集(Major GC/Old GC)只有老年区的垃圾收集。
- 整堆收集(Full GC):收集整个Java堆内存和方法区的垃圾。
注:整堆收集出现的情况:System.gc();老年区空间不足;方法区空间不足。
用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。
方法区是很重要的系统资源,是硬盘和 CPU 的中间桥梁,承载着操作系统和应用程序的实时运行。