Java内存模型简述


  • 程序计数器(记录代码指令地址)
  • Java虚拟机栈(记录Java方法执行时信息)
  • 本地方法栈(记录Native方法执行时信息)
  • 方法区(记录类信息,常量,静态变量)
  • Java堆(用于对象实例化内存分配)

1.程序计数器

  • 记录当前线程执行的字节码指令地址
  • 线程隔离(及线程私有,每个线程都有一个程序计数器)
  • 如当前执行native方法,则计数器值为空
  • 不会抛出OutOfMemory(虚拟机规范中无规定)
  • 字节码解释器通过改变程序计数器的值来选去下一条指令

2.Java虚拟机栈

  • Java方法执行的内存模型(一个方法开始执行时,会创建一个栈帧,用来存储该方法的各种信息,并把栈帧push入栈,在方法执行完成之后,把栈帧pop出栈)
  • 线程隔离且生命周期与线程相同
  • 会抛出StackOverflow(因为每执行一个方法都会产生一个栈帧入栈,所以调用递归方法时会比较容易抛出该异常)
  • 会抛出OutOfMemory

3.本地方法栈

  • 用于Native方法(作用同Java虚拟机栈)
  • 对语言,使用方式,数据结构无限制(所以不一定只能用C和C++,理论上说还可以用Python,甚至Js?)
  • 线程隔离且生命周期与线程相同
  • 会抛出StackOverflow和OutOfMemory

4.方法区

  • 记录类加载信息,常量,静态变量等数据
  • 推荐实现垃圾回收(类型的卸载,常量的回收,可以不实现)
  • 线程共享
  • 会抛出OutOfMemory

5.Java堆

  • 对象实例的内存分配(几乎所有对象,但并不绝对)
  • 需要实现垃圾回收(该区域为垃圾回收主要区域)
  • 线程共享
  • 划分为多个区域(以适应垃圾回收机制的优化)
  • 会抛出OutOfMemory

补充

  • Java虚拟机栈中的栈帧:存储存储局部变量表,操作数栈,动态链接,方法出口等信息
  • 局部变量表:存储基本数据类型,对象引用和一条字节码指令地址returnAddress
  • 操作数栈:Java虚拟机的解释执行引擎基于操作数栈,如某个指令将从栈中pop操作数,执行运算,再将结果push入栈。
  • 对象引用:可能是一个指向对象起始地址的指针或是代表对象的句柄或是其他与此对象相关的位置
  • 运行时常量池:方法区中的一个区域,保存class文件中的符号引用和翻译出来的直接引用

对于读《深入理解Java虚拟机》中内存区域的一个简单的了解总结。如有错误请指出。

你可能感兴趣的:(Java内存模型简述)