jvm学习的核心(二)---运行时数据区概述

文章目录

    • 1.方法区( Method Area)
    • 2.堆(Heap)
    • 3.本地方法栈(Native Method Stacks)
    • 4.程序计数器(pc Register)
    • 5.虚拟机栈(Virtual Machine Stacks)

运行时数据区
jvm学习的核心(二)---运行时数据区概述_第1张图片

运行时数据区,顾名思义,就是jvm运行时的数据区,用于支持jvm的正常运行

1.方法区( Method Area)

jvm学习的核心(二)---运行时数据区概述_第2张图片
1:方法区属于共享区域,所有线程共享一个方法区

2:方法区类似于存储区,它存储每个类的结构,如运行时常量池,字段和方法数据,以及方法和构造函数的代码 ,包括在类和实例初始化和接口初始化中使用的特殊方法

3:方法区在jvm启动时创建。

4:方法区不要求内存连续,方法区大小可以调整,当方法区内存不够时会爆出OutOfMemoryError异常。

总结:方法区更像是一本说明书,记录了结构,类等细节信息。

2.堆(Heap)

jvm学习的核心(二)---运行时数据区概述_第3张图片
1:堆区属于共享区域,所有线程共享一个堆。

2:堆是为所有类实例和数组分配内存的运行时数据区域。

3:堆区在jvm启动时创建。

4:对象不需要显式释放,所有对象的回收,都由jvm代劳

5:堆不需要连续内存,堆可以调整大小,当堆空间不足以满足计算时可能出现OutOfMemoryError

3.本地方法栈(Native Method Stacks)

jvm学习的核心(二)---运行时数据区概述_第4张图片

引用链接: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)

jvm学习的核心(二)---运行时数据区概述_第5张图片
1:早期也叫java栈,线程独有,伴随着线程而创建

2:它保存局部变量表和部分结果,并在方法调用和返回中发挥作用

3:如果线程中的计算需要比允许的更大的Java虚拟机堆栈,则Java虚拟机抛出StackOverflowError

4:如果Java虚拟机栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那Java虚拟机将会抛出一个OutOfMemoryError异常

你可能感兴趣的:(jvm,学习,java)