温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何理解JVM内存结构程序计数器和栈

发布时间:2021-10-11 17:57:17 来源:亿速云 阅读:120 作者:iii 栏目:编程语言

本篇内容介绍了“如何理解JVM内存结构程序计数器和栈”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

程序计数器

JVM中的程序计数寄存器(Program Counter Register)中, Register 的命名源于CPU 的寄存器,寄存器存储指令相关的现场信息。 CPU 只有把数据装载到寄存器才能够运行。
举例:
public int test() {
    int x = 0;
    int y = 1;
    return x + y;
}

虚拟机栈

栈的特点

1. 基本操作

如何理解JVM内存结构程序计数器和栈

2. 栈中存在垃圾回收吗?
3. 栈中可能抛出的异常是什么?StackOverflowError?OutOfMemoryError?
4. 如何设置栈内存的大小? -Xss size (即:-XX:ThreadStackSize)
    一般默认为512k-1024k,取决于操作系统。
 
 对应的字节码:
public int test();
    descriptor: ()I
 
    flags: ACC_PUBLIC
 
    Code:
      stack=2, locals=3, args_size=1
         0: iconst_0
         1: istore_1
         2: iconst_1
         3: istore_2
         4: iload_1
         5: iload_2
         6: iadd
         7: ireturn
 
      LineNumberTable:
        line 7: 0
        line 8: 2
        line 9: 4
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
 
            0       8     0  this   Lcom/alibaba/uc/TestClass;
            2       6     1     x   I
            4       4     2     y   I
 
 
为什么需要记录当前线程的执行地址?
为什么PC寄存器是线程私有的?

栈桢(Stack Frame)

1. 方法和栈桢之间存在怎样的关系?
   > 栈帧是一个内存区块,是一个数据集,维系着方法执行过程中的各种数据信息。

如何理解JVM内存结构程序计数器和栈

2. 栈桢的内部结构

如何理解JVM内存结构程序计数器和栈

如何理解JVM内存结构程序计数器和栈

局部变量表:

1. 定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量

 如何理解JVM内存结构程序计数器和栈
2. 这些数据类型包括各类基本数据类型、对象引用(reference),以及returnAddress类型
3. 存在线程安全问题吗?
4. 举例
public class SlotTest {
    public void localVarl() {
        int a = 0;
        System.out.println(a);
        int b = 0;
    }

    public void localVar2() {
        {
            int a = 0;
            System.out.println(a);
        }
        //此时的b就会复用a的槽位
        int b = 0;
    }
}
 
5. 局部变量表中的变量也是重要的垃圾回收根节点,只要被局部变量表中直接或间接引用的对象都不会被回收。
 
 操作数栈:

1. 操作数栈,也称为表达式栈,后进先出。
2. 在方法执行过程中,根据字节码指令,往栈中写入数据或提取数据,即入栈(push)/出栈(pop)。并非采用索引访问。
3. 举例:
public void testAddOperation(){
    byte i = 15;
    int j = 8;
    int k = i + j;
}
4. 字节码分析:

如何理解JVM内存结构程序计数器和栈

如何理解JVM内存结构程序计数器和栈

如何理解JVM内存结构程序计数器和栈
 
 
 如何理解JVM内存结构程序计数器和栈

如何理解JVM内存结构程序计数器和栈

如何理解JVM内存结构程序计数器和栈

如何理解JVM内存结构程序计数器和栈
 
 如何理解JVM内存结构程序计数器和栈

动态链接:

动态链接(或指向运行时常量池的方法引用)
1. 每一个栈帧内部包含一个指向运行时常量池中该栈帧所属方法的引用,包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接
2. 在java源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用(Symbolic Reference)保存在class文件的常量池里。比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用。
3. 为什么需要常量池?

public class SimpleClass {
    public void sayHello() {
        System.out.println("hello");
    }
}
 
 

本地方法栈

Java 虚拟机栈用于管理Java 方法的调用,而本地方法栈用于管理本地方法的调用。
本地方法是使用C语言实现的。
它的具体做法是Native Method Stack中登记native方法,在Execution Engine 执行时加载本地方法库。

如何理解JVM内存结构程序计数器和栈

“如何理解JVM内存结构程序计数器和栈”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI