JVM(三)、运行时数据区

运行时数据区在JVM中是非常重要的知识;(面试高频)

运行时数据区时程序在运行时使用的内存区域,包括五个部分:方法区、堆、虚拟机栈、本地方法栈、程序计数器;

注意:方法区和堆是所有线程共享的内存区域;而虚拟机栈、本地方法栈、程序计数器都是线程私有的;这个一定要记住;

1、方法区(Method Area)

#在官网是这样描述的
The Java Virtual Machine has a method area that is shared among all Java Virtual Machine threads. 
The method area is created on virtual machine start-up.
Although the method area is logically part of the heap,......
It stores per-class structures such as the run-time constant pool, field and method data, and the code for methods and constructors, including the special methods (§2.9) used in class and instance initialization and interface initialization.
If memory in the method area cannot be made available to satisfy an allocation request, the Java Virtual Machine throws an OutOfMemoryError.
  1. 方法区是各个线程共享的一块内存区域,在虚拟机启动时创建;
  2. 虽然Java虚拟机规范把方法区描述为堆的一部分,但是他却又有一个别名叫No-Heap(非堆),目的就是与堆区分开来;
  3. 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据;
  4. 当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常

2、堆(Heap)

  1. Java堆是Java虚拟机中内存最大的一块区域,在虚拟机启动时创建,被所有线程共享;
  2. Java对象实例和数组都在堆上分配;

3、Java虚拟机栈(Java Virtual Machine Stacks)

为了更好的理解虚拟机栈,打个比方;

假如现在目前阶段是已经初始化完毕了,后续做什么呢?从类加载机制上我们就能看出,到了Use(使用)环节,那怎么才能被使用呢?换句话说,里面的内容怎样才能被执行呢?比如通过主函数main调用其他方法,实际上是main方法执行之后调用了其他方法,所以要想使用里面的内容,就要以线程为单位执行相应的方法才行。

那么问题来了,一个线程的状态如何维护?一个线程可以执行多少个方法?关系怎么维护?

  1. 虚拟机栈是一个线程执行的区域,保存着线程中方法的调用状态;通俗来说,就是一个Java线程的运行状态,由一个虚拟机栈来保存,所以虚拟机栈肯定是线程私有的,随着线程的创建而创建。
  2. 每一个被线程执行的方法叫做栈帧,即每个方法对应一个栈帧。每调用一个方法,就会往栈中压入一个方法,方法调用完成,就会把该栈帧从栈中弹出来;
栈帧:

栈帧:每个栈帧对应一个被调用的方法,可以理解为一个方法的运行空间。

每个栈帧中包括局部变量表(Local Variables)、操作数栈(Operand Stack)、指向运行时常量池的引用(A reference to the run-time constant pool)、方法返回地址(Return Address)和附加信息。

  • 局部变量表:方法中定义的局部变量以及方法的参数存放在这张表中,局部变量表中的变量不可直接使用,如需要使用的话,必须通过相关指令将其加载至操作数栈中作为操作数使用。就比如上图中int a= 1;int b = 1;int c = a+ b;如果想拿到局部变量c是这样操作的,将a=1放入操作数栈,b=1放入操作数栈,然后根据c=a+b在操作数栈中算出2然后返回给局部变量表;
  • 操作数栈:也是一个栈,以压栈和出栈的方式存储操作数的
  • 动态链接:每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用(将这些符号方法引用转换为具体的方法引用)
  • 方法返回地址:当一个方法开始执行后,只有两种方式可以退出,一种是遇到方法返回的字节码指令;一种是遇见异常,并且这个异常没有在方法体内得到处理。

4、本地方法栈

和虚拟机栈作用类似,主要服务于Native方法的执行。

5、程序计数器(Program Counter)

程序计数器是一块较小的内存区域,它用于存储当前线程所执行的字节码指令的行号。因为有的时候线程执行一半或者没执行完的时候,CPU调度算法就调度开始执行了其他的线程,所以没有被执行完的线程需要记录一下执行到哪;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆包侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值