1.运行时数据区
堆
- 存放对象的实例,数组
- 线程共享,最大,虚拟机启动时创建
- 堆上无内存可完成实例分配且堆无法扩展时->OutOfMemeoryError
- 逻辑上连续,-Xmx -Xms控制堆大小
方法区(永久代)
- 存放虚拟机加载的类信息,常量,静态变量,(即时编译器编译后的代码)
- 无法满足内存分配需求时->OutOfMemoryError
虚拟机栈
- 有个局部变量表,存放了基本数据类型,对象的引用,returnAddress类型(指向一条字节码指令的地址)
- 线程请求栈深度大于虚拟机所允许深度->StackOverflowError
- 虚拟机栈扩展时无法申请到足够的内存->OutofMemoryError
本地方法栈
程序计数器
- 记录正在执行的虚拟机字节码指令地址
- 执行本地方法是计数器为空(undefined)
- 线程私有,唯一一个无OutOfMemoryError的区域
运行时常量池
- 方法区的一部分,存放编译期生成的字面量,和符号引用
- 常量池无法申请内存时->OutOfMemoryError
2.新生代,老年代,持久代?各存了什么?
新生代
- 存放存活率低的对象,新创建的对象一般放新生代(Eden区),(大对象直接放老年代)
老年代
- 存放存活率较高的对象,
- 新生代的对象经过minor gc后存活且survivor区可容纳则进入survivor区,年龄为1,在survivor区每安全度过一次minor gc,年龄加一,一般年龄为15就进入老年代
持久代