**此处指的虚拟机特指HotSpot,其他不做讨论。**
对于Java来说,虚拟机帮助我们自动管理内存。我们需要了解虚拟机是怎样管理内存的,首先我们需要了解虚拟机内存的各个区域,以及这些区域的用途、何时创建以及销毁。
1、程序计数器
可以看作是当前线程所执行的字节码的行号指示器。
因为多线程是通过线程轮流切换、分配处理器的执行时间的方式来实现的,一个处理器在同一时刻只能够执行一个线程中的指令,为了能够让每个线程都能够在执行的时候从上次的位置继续执行,每个线程都有一个程序计数器。
2、虚拟机栈
描述的是Java方法执行的线程内存模型。
每个方法被执行的时候虚拟机栈会同步创建一个栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等信息。一个方法被调用到执行完毕的过程就是一个栈帧入栈到出栈的过程。
3、本地方法栈
为虚拟机使用到的本地方法服务。虚拟机将本地方法栈与虚拟机栈合二为一。
4、堆
此区域唯一的目的就是存放对象实例。
堆可以处于物理上不连续的内存空间中,但是在逻辑上它应该被视为连续的。
它是可以扩展的。
5、方法区
它用于存储已经被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。
JDK8之前,把方法区称为永久代是因为当时的虚拟机设计团队使用永久代来实现方法区,使得垃圾回收器能够像管理堆一样管理这部分内存。
JDK8之后,使用在本地内存中实现的元空间来代替