虚拟机-运行时数据区

在这里插入图片描述
1.程序计数器
计数器表示当前线程所执行的字节码的行号。
线程私有,属于线程私有的内存区域。
2.Java虚拟机栈
线程私有,描述Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。一个方法从调用到执行完成对应一个栈帧在虚拟机栈中的入栈和出栈过程。
规定的异常情况有两种:1.线程请求的栈的深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;2.如果虚拟机可以动态扩展,如果扩展时无法申请到足够的内存,就抛出OutOfMemoryError异常。
3.本地方法栈
和Java虚拟机栈(执行的方法为JAVA方法)很类似,不同的是本地方法栈为Native方法(本地方法的不一定是JAVA方法)服务。
4.Java堆
线程共享,在虚拟机启动时创建。堆区唯一目的就是存放对象实例,是垃圾回收管理的主要区域。
堆无法扩展时,抛出OutOfMemoryError异常。
5.方法区
所有线程共享,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。这个区域内存回收目标主要是常量池的回收和对类型的卸载。(相比堆是回收机制的次要部分)
当方法区无法满足内存分配需求时,抛出utOfMemoryError。
6.运行时常量池
是方法区的一部分。编译完成的class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项是常量池,用于存放编译期间生成的各种字面量(如int i=1中整数1就是字面量)和符号引用(例如,在Java中, 一个Java类将会编译成一个class文件. 在编译时, Java类并不知道所引用的类的实际地址, 因此只能使用符号引用来代替)。
并非预置入Class文件中常量池的内容才进入方法运行时常量池,运行期间也可能将新的常量放入池中,这种特性被开发人员利用得比较多的便是String类的intern()方法。
当方法区无法满足内存分配需求时,抛出OutOfMemoryError。
7.直接内存
并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。
JDK1.4加入了NIO,引入一种基于通道与缓冲区的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。因为避免了在Java堆和Native堆中来回复制数据,提高了性能。(相比于堆,申请空间用时更长,但是读写速度更快。)
当各个内存区域总和大于物理内存限制,抛出OutOfMemoryError异常。

猜你喜欢

转载自blog.csdn.net/weixin_44315921/article/details/86167232
今日推荐