从JVM讨论关于程序运行时的内存分配

Java文件被JVM加载到内存的过程

在这里插入图片描述

程序计数器

**作用:**记录代码已经执行到的位置,方便CPU重新执行此线程时,知道从哪里开始执行指令。
**使用场景:**恢复线程、分支操作、循环操作、跳转、异常处理等。
补充:

  1. 程序计数器不规定OOM;
  2. 程序计数器的线程私有的,每条线程内部都有一个稀有的程序计数器,生命周期依赖线程的创建和结束;
  3. 程序计数器记录的是正在执行的虚拟机字节码指令的地址,但如果正在执行的是本地(native)方法,则计数器值为空。

虚拟机栈

线程私有,与线程的生命周期同步。每个方法被执行时,JVM会再虚拟机栈中创建一个栈帧。
虚拟机栈规定了两种异常状况

StackOverflowError(栈溢出):当线程请求栈深度超出虚拟机栈所允许的深度时抛出;

出现的原因:

  • 无限递归循环调用(最常见)。
  • 执行了大量方法,导致线程栈空间耗尽。
  • 方法内声明了海量的局部变量。

OutOfMemoryError(OOM):当JVM无法申请到足够内存时抛出。

栈帧

用于支持虚拟机进行方法调用和方法执行的数据结构,线程在执行某个方法时,都会为这个方法创建一个栈帧。一个线程中包含多个栈帧,每个栈帧内部包含局部变量表、操作数栈、动态链接、返回地址。

局部变量表
是变量值的存储空间,调用方法时传递的参数以及在方法内部创建的局部变量都保存局部变量表中。在Java编译成class文件时,会在方法的code属性表中的max_local数据项中确定该方法需要分配的局部变量表的最大容量。系统不会为局部变量赋初始值(实例变量和类变量都会赋初始值)。

操作数栈
跟局部变量表一样,操作栈最大深度也是存放在max_stacks数据项中,栈中的元素可以是任意Java数据类型。

动态链接
作用是支持方法调用过程中的动态连接。

返回地址
作用是帮助当前方法恢复它上层方法的执行状态

本地方法栈

与虚拟机栈基本相同,针对本地方法。

是JVM所管理的内存中最大的一块,该区域的目的是存放对象实例,几乎所有对象的实例都在堆里分配,因此它也是Java垃圾收集器管理的主要区域。堆是所有线程共享的内存区域,如果此区域的对象被多个线程访问需要考虑线程安全问题。
堆中内存的结构如下:
在这里插入图片描述
不同的区域存放不同生命周期的对象,这样可以根据不同区域使用不同的垃圾回收算法,从而更有针对性,提高垃圾回收的效率。

方法区

是JVM规定的一块运行时数据区,主要存储已经被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码和数据。该区域也是被线程共享的内存区域。

举个栗子

public int add(){
	int i = 1;
    int j = 2;
    int result = i + j;
    return result + 10;
}

可以使用javap命令查看某个类的字节码指令;

常用指令
iconst和bipush:将常量压入操作数栈顶,int取值在-15时用iconst指令,取值在-128127采用bipush指令;
istore:将操作数栈顶的元素放入局部变量表的某索引位置,如istore_5代表将操作数栈顶元素放入局部变量下标为5的位置;
iload:将局部变量表中某下标的值加载到操作数栈栈顶中,如iload_2代表将局部变量表索引为2上的值压入操作数栈顶;
iadd:加法运算,将操作数栈最上方的两个元素进行相加操作,得到的结果重新压入栈顶。

过程如下:

Add.java被编译成Add.class的时候,栈帧中需要多大的局部变量表和操作数栈都已经完全确定,并写入方法的code属性中。add()方法中有3个局部变量,因此布局变量表的大小为3,初始时操作数栈为空。
1、初始状态;
在这里插入图片描述
2、iconst_1,把1压入操作数栈顶;
在这里插入图片描述
3、istore_1把操作数栈顶的元素出栈并放入局部变量表下标为1的位置;
在这里插入图片描述
4、iconst_2把常量2压入操作数栈顶;
5、istore_2把操作数栈顶的元素出栈并放入局部变量表下标为2的位置;
6、iload_1和iload_2表示将局部变量中下标为1和2的元素重新压入操作栈中;
在这里插入图片描述
7、iadd,执行家法操作,并将结果重新压入操作栈栈顶;
在这里插入图片描述
8、istore_3将操作数栈顶元素出栈,保存在局部变量表下标为3的位置;
9、iload_3,压入栈顶;
10、bipush_10,把10压入栈顶;
11、iadd操作,将栈顶最上方的3和10相加;
12、执行return指令,将操作数栈顶的元素13返回给上层方法。

注:以上内容只是在Java虚拟机规范中定义的规则,这些规则规定了各区域的职责,并不等同于虚拟机的“具体实现”,不同公司的产品虚拟机的实现不同。

发布了4 篇原创文章 · 获赞 0 · 访问量 34

猜你喜欢

转载自blog.csdn.net/er_fa/article/details/105360975
今日推荐