java内存模型简介

Java内存模型包括:

堆、方法区、栈、本地方法栈、程序计数器

其中:堆和方法区是所有线程共享的内存区域,栈、本地方法栈和程序计数器是各个线程私有的内存区域
1、堆

是所有内存中最大的一块,

负责存储几乎所有的对象实例,

是java垃圾收集器管理的主要区域,

在物理上可以是不连续的内存空间,

如果内存分配完成,将会抛出OutOfMemoryError异常,

可细分为新生代(包括:Eden区、From Survivor区、To Survivor区)和老年代

2、方法区

也叫“永久代”或“持久代(PermGen)”,用于存储类信息、常量、静态变量、编译后的代码数据,

可能出现垃圾回收,单比较少出现,回收的目标为:常量池和类的卸载

如果没有内存分配时,将跑出OutOfMemoryError异常

3、栈

每个方法被执行会同事创建一个栈帧,

用于存放局部变量表、操作栈、动态链接、方法出口等信息,

可能抛出两种异常(1)StackOverflowError: 调用的方法深度太深 (2)OutOfMemoryError: 无法申请到足够内存时

4、本地方法栈

可能抛出两种异常(1)StackOverflowError: 调用的方法深度太深 (2)OutOfMemoryError: 无法申请到足够内存时

5、程序计数器

是线程私有的一块较小内存空间,

分支、循环、跳转、异常处理、线程恢复等需要依赖程序计数器来完成,

如果执行的是java方法,则记录的是正在执行的字节码指令的地址,

如果执行的是Native方法,则计数器的值为空(Undefined)

该内存区域是唯一一个不会报OutOfMemoryEroor的区域




标签: 计数器、outofmemoryerror、区域、stackoverflowerror、太深、面试
  • 回复
隐藏