文章目录
- 1.方法区( Method Area)
- 2.堆(Heap)
- 3.本地方法栈(Native Method Stacks)
- 4.程序计数器(pc Register)
- 5.虚拟机栈(Virtual Machine Stacks)
运行时数据区
运行时数据区,顾名思义,就是jvm运行时的数据区,用于支持jvm的正常运行。
1.方法区( Method Area)
1:方法区属于共享区域,所有线程共享一个方法区
2:方法区类似于存储区,它存储每个类的结构,如运行时常量池,字段和方法数据,以及方法和构造函数的代码 ,包括在类和实例初始化和接口初始化中使用的特殊方法
3:方法区在jvm启动时创建。
4:方法区不要求内存连续,方法区大小可以调整,当方法区内存不够时会爆出OutOfMemoryError
异常。
总结:方法区更像是一本说明书,记录了结构,类等细节信息。
2.堆(Heap)
1:堆区属于共享区域,所有线程共享一个堆。
2:堆是为所有类实例和数组分配内存的运行时数据区域。
3:堆区在jvm启动时创建。
4:对象不需要显式释放,所有对象的回收,都由jvm代劳
5:堆不需要连续内存,堆可以调整大小,当堆空间不足以满足计算时可能出现OutOfMemoryError
3.本地方法栈(Native Method Stacks)
引用链接:https://blog.csdn.net/phg739436146/article/details/108412116 简单来讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java方法:该方法的实现由非java语言实现。在定义一个native method时,并不提供实现体(有些像定义一个java interface),因为其实现体是由非java语言在外面实现的。本地接口的作用是融合不同的编程语言为java所用,它的初衷是融合C/C++程序。
1:如果提供了本机方法堆栈,则通常在创建每个线程时为每个线程分配。
2:它提供了java调用非java代码的接口。
3:如果线程中的计算需要比允许的更大的本机方法堆栈,则Java虚拟机抛出StackOverflowError。
4:如果本机方法堆栈可以动态扩展,并且尝试了本机方法堆栈扩展,但可用内存不足,或者可用内存不足,无法为新线程创建初始本机方法堆栈,则Java虚拟机抛出OutOfMemoryError异常。
5:当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界。它和虚拟机拥有同样的权限。
总结:本地方法栈在早期让java合理的调用高效率代码,弥补了效率不足的缺憾
4.程序计数器(pc Register)
1:每个Java虚拟机的线程都有自己的pc(程序计数器)寄存器。
2:在任何时候,每个Java虚拟机线程都在执行单个方法的代码,即该线程的当前方法。
3:如果正在执行的是Native
方法,则这个计数器值为空
4:JVM规范中唯一没有规定OutOfMemoryError情况的区域
5.虚拟机栈(Virtual Machine Stacks)
1:早期也叫java栈,线程独有,伴随着线程而创建
2:它保存局部变量表和部分结果,并在方法调用和返回中发挥作用
3:如果线程中的计算需要比允许的更大的Java虚拟机堆栈,则Java虚拟机抛出StackOverflowError
4:如果Java虚拟机栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那Java虚拟机将会抛出一个OutOfMemoryError
异常