从以下几个方面看
- 用途
- 生命周期(何时创建和销毁)
- 作用域(是否线程独享)
程序计数器
当前线程所执行的字节码的行号计数器 该值就指示下一条将要执行的指令, 它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复都依赖它完成。
Java虚拟机栈
线程私有 描述的是Java方法执行的线程内存模型 每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧,用于存储 局部变量表、操作数栈、动态连接、方法出口等信息。 每个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中 从入栈到出栈的过程。
局部变量表
存放基本数据类型、对象引用类型、returnAddress类型(指向一条字节码指令的地址)
局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法 需要在栈帧中分配多大的局部变量空间是完全确定的。
本地方法栈
Java堆
线程共享,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例。 虚拟机规范中:所有的对象实例以及数组都应当在堆上分配。 从内存分配的角度看,所有线程共享的Java堆中可以划分出多个线程私有的分配 缓冲区,以提升对象分配时的效率。
从回收内存的角度看,由于现代垃圾收集大部分都是基于分代收集理论设计的。 将Java堆细分的目的只是为了更好地回收内存,或者更快地分配内存。
Java堆作为研究对象,以下属性值得关注
- 逻辑连续
- 各分区大小(可扩展,-Xmx -Xms 设定)
方法区
线程共享 用于存储被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。
运行时常量池
Class文件是磁盘文件,内中信息需载入内存。 Class文件中的常量池是如何映射到运行时常量池的?