Java内存区域
- 堆
- 栈
- 方法区
- 本地方法栈
- 程序计数器
堆:
- 一般为内存中最大的一块,用来存放对象实例
- 线程共享
- GC管理的主要区域,分为新生代和老年带
- 堆无法拓展时,抛出OutOfMemoryError
- 不需要连续内存(逻辑上连续)
Java虚拟机栈
- 线程私有,生命周期与线程相同
- 创建栈帧,存储局部变量表等
- 线程请求的栈深度大于虚拟机允许的深度时,抛出StackOverflowError
- 无法拓展时,抛出OutOfMemoryError
方法区(包含运行时常量池)
- 线程共享
- 存储已被JVM加载的类信息、常量、静态变量等
- 不需要连续内存(逻辑上连续)
- 无法满足内存分配需求时,抛出OutOfMemoryError
- 包含运行时常量池
本地方法区
- 为Native方法服务
2. 可抛出StackOverflowError与OutOfMemoryError
程序计数器
- 较小的内存空间
- 当前线程所执行的字节码的行号指示器
- 线程私有,每个线程都有一个独立的程序计数器
- 线程执行Java方法时,记录正在执行的虚拟机字节码指令地址;Native方法时,值为空(Undefine)
- JVM规范中唯一没有规定任何OutOfMemoryError情况的区域