JDK 1.8之前:
JDK 1.8 :
名称 | 包含数据类型 |
oom、Stack Overflow场景
|
是否线程共享
|
程序计数器 | 字节码指令 | 无 | 否 |
Java栈 | 栈帧(局部变量表【基础类型和对象引用】、操作数栈、方法出口、附加信息、指向运行时常量池的引用) | 线程请求虚拟机栈深度大于虚拟机所允许的深度(STF),虚拟机栈可以动态扩展,无法获取到足够的空间(OOM) | 否 |
Native栈 | 与Java栈相同 | 否 | |
方法区 | 编译器编译后的代码、类的信息(类的方法、方法信息、字段信息)、静态变量 | 用大量的类去填满方法区就好了,比如用类加载去加载jar包 | 是 |
运行时常量池(方法区的一部分) | 编译器生成的字面量和符号引用(符号引用就是不能知道具体内存的一个标识,用于表达源代码中一个固定值的表示法| int a = 10; // 10为int类型字面量)不同于Class文件常量池,动态性(运行期也可以放入) | 是 | |
堆 | 对象实例数据、数组、常量池 | 限制堆内存大小为20MB,不断产生新对象 | 是 |