线程私有
-
程序计术器(内存空间较小):
存储内容:当前线程所执行的字节码的行号指令器,用来取下一条要执行的字节码指令。线程执行java方法,计数器记录正在执行的虚拟机字节码;本地方法则为空。
注:不会发生OutOfMemoryError -
虚拟机栈(线程的内存模型):
存储内容:如图所示,特别说明,局部变量表存储的编译可知的Java基本类型(int、float等)、对象引用(reference)、returnAddress类型(指向一条字码指令的地址);
reference的特别说明:指向对象的引用,如图所示,目前有两种方式访问,一个是句柄池,一个是直接指针
异常:StackOverflowError(线程请求的栈的深度大于虚拟机所允许深度);OutOfMemoryError(栈动态扩展时没有申请到足够的内存) -
本地方法栈:与虚拟机栈类似,区别是虚拟机栈为java方法服务,本地方法为非java方法服务
线程共享
-
Java堆:
存储内容:对象实例及数组
异常:OutOfMemoryError(堆没有完成实例分配并且堆不能扩展时)
注:java堆的实现可以时固定大小,也可以是可扩展(参数-Xmx和-Xms) -
方法区:
存储内容:已经被虚拟机加载的类型信息、常量、静态变量、即时编译后的代码缓存等
异常:OutOfMemoryError(方法区无法满足新的内存分配需求时)【运行时常量区同类】
注:此区内存回收的主要目的时针对常量池加和对类型的卸载
直接内存
存储内容:非虚拟机定义的内存,
异常:OutOfMemoryError(直接内存+java虚拟机运行时内存 > 物理内存)