Java内存区域与内存异常异常

运行时数据区

方法区(Method Area)

存放已加载的信息

异常

如果无法满足内存分配时抛出OutOfMemoryError

Java堆(Java Heap)

所有线程共享,在虚拟机启动时创建。
目的:存放对象实例,几乎所有对象都在这分配内存
这是垃圾收集器管理的主要区域故称GC堆

从垃圾收集器收集算法分为

  • 老年代
  • 新生代
    可以再细分为
  • Eden空间
  • From Surivivor空间
  • To Surivivor空间

从内存分配:分为多个线程私有的分配缓存区(Thread Local Allocation Buffer, TLAB)

规范中规定:Java堆在物理上可以不连续但逻辑上是连续的

虚拟机栈(VM Stack)

线程私有

  • 生命周期与线程相同
  • 每个方法执行的同时都会创建一个栈帧(Stack Frame)用于存储方法执行所需参数(局部变量表、操作数栈、动态链接、方法出口等)

异常

  • 请求深度大于虚拟机允许的深度则抛出StackOverflowError异常
  • 如果虚拟机栈可动态扩展(大部分虚拟机允许动态扩展),如果扩展无法申请到内存则抛出OutOfMemoryError异常

局部变量表

  • 存放:基本数据类型、对象引用、renterAddress类型(一条字节码指令地址)
  • 其所需空间在编译期间完成,且运行期间不会改变其大小

本地方法栈(Native Method Stack)

虚拟机栈与本地方法栈作用相似。虚拟机栈执行Java方法、本地方法栈执行Native方法服务

程序计数器(Program Counter Register)

线程私有

分配较小内存。存放当前线程执行字节码行号指示器,通过改变计数器的值来获取下一条指令

  • 执行Java方法,记录正在执行的虚拟机字节码指令地址
  • 执行Native方法,计数器为空 Undefined
  • 是唯一一个没有规定任何OutOfMemoryError的内存区域。其原因是Java虚拟机是多线程,通过线程轮流切换并分配处理器执行时间方式来执行

你可能感兴趣的:(Java内存区域与内存异常异常)