关注点
- 各个部分的作用
- 各个部分的生命周期
各个部分的作用
- 线程共享的区域:方法区和堆
- 线程独享区:虚拟机栈、本地方法栈、程序计数器
方法区
方法区存放的数据大致分为四类:加载的类的信息、常量、静态变量、编译后的代码。
处于垃圾回收的考虑,方法区存放的是一些生命周期比较长的数据,这样有利于对内存的管理。
堆
堆用来存放对象的实例。
堆跟方法区的作用正好对立,堆存放的是一些生命周期比较短的数据。、
堆是线程共享的一块区域,里面的数据的生命周期长短不齐,因此是 GC 主要工作区,因为是线程共享,所以还存在同步互斥问题。
虚拟机栈
虚拟机栈是方法执行的内存模型,虚拟机会为每一个方法创建一个栈帧(Stack Frame),栈帧是一个方法的内存存储单元,存储这一个方法执行所需要的所有数据。
一个栈帧中的信息如下:
- 局部变量表
- 操作数栈:用于存储操作数,跟寄存器存储操作数的作用一致
- 动态链接:每个栈帧中都有一个指向方法代码的地址(方法代码位于方法区内的编译后的代码中)
- 方法出口:方法执行完时,要返回到调用者的调用该方法的位置,这样程序才能继续执行(如果方法执行时有出现异常,会有一个异常方法出口,上层的调用者不会得到该出口地址),该位置的地址就是方法入口,也就是方法执行完后的下一个执行点
本地方法栈跟虚拟机栈很相似,只是用来运行本地的方法,而且虚拟机对这些方法的语言、使用方式和数据结构没有强制的规定,很灵活
程序计数器
指示指令的执行顺序