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虚拟机是多线程,通过线程轮流切换并分配处理器执行时间方式来执行
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容