01.内存模型

一、运行时数据区

1、程序计数器:线程私有,当前线程所执行的字节码的行号指示器,存储的是下一条需要执行的字节码指令,比如分支、循环、异常处理等。

2、虚拟机栈:线程私有,生命周期与线程同相同,描述的是 Java 方法执行的内存模型:每个方法在执行时会创建一个栈帧,用于存放局部变量表等,每个方法执行过程就是栈帧的入栈和出栈的过程。如果线程请求的栈深度大于允许的深度,就会抛出 StackOverflowError。

3、本地方法栈:线程私有,与虚拟机栈作用类型,区别在于:虚拟机栈执行的是 Java 方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。(PS:Sun HotSpot 虚拟机直接把本地方法栈和虚拟机栈合二为一了)

4、堆:线程共享,虚拟机启动时分配内存,存放所有对象实例及数组。垃圾收集器管理的主要区域。堆空间在物理上可能是不连续的。如果在堆中没有可用内存完成实例分配,会抛出 OutOfMemoryError。

5、方法区:线程共享,存储已被虚拟机加载的类信息、常量、静态变量等数据。(方法区相当于一个特殊的堆,内存管理是个大问题,垃圾收集器也会扫这里,但回收“成绩”比较差,用超了也会 OutOfMemoryError。)

6、运行时常量池:线程共享,是方法区的一部分,存储编译器生成的各种字面量和符号引用,也可以在运行期间存入,比如:String.intern(),用超了也会 OutOfMemoryError。

7、直接内存:也叫堆外内存,超过机器物理内存,也会 OutOfMemoryError。NIO使用的就是堆内引用+堆外内存方式。


JDK 8.0 之前
JDK 8.0 之后

你可能感兴趣的:(01.内存模型)