写点什么

JVM 内存模型详解,java 程序设计案例教程第二版答案

用户头像
极客good
关注
发布于: 刚刚

public class User2 {


private static String realName = "zhangsan";


private String userName = "lisi";


}


当这两个类被加载到 JVM 中时,它们被存储在方法区域中(类的所有类变量都被分配)。下图:


程序计数器(执行代码指令)

我们知道加载到 JVM 中的类对象是。我们在之后编写的类文件。编译了 Java 文件。


编译后,我们的代码将被编译成计算机能理解的字节


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


代码。还有这个。calss 文件是我们的代码编译的字节码。


当加载到内存中时,字节码执行引擎开始工作。为了执行我们编译的代码指令,问题出现了。我们是否需要一个内存空间来记录字节码执行引擎当前执行的位置?这个特殊的存储区域是程序计数器,用来记录当前执行的字节码指令的位置。


注:在多线程环境下并发执行时,计算器的 CPU 是确定的。当 CPU 从线程 1 切换到线程 2,然后又切换回线程 1 时,您想知道线程 1 将采取哪个步骤吗?这是程序计数器的功能。因此,当一个线程再次将其上下文切换到前一个代码时,它需要一个特殊的记录,记录当前线程已经执行了哪个字节码。所以每个线程都有自己的程序计数器。?

栈空间,也成为 Java 虚拟机栈

当一个线程执行一个方法时,如果该方法有一个局部变量,那么就需要一个区域来存储该局部变量的数据信息。这个区域被称为 Java 虚拟机栈。


每个线程都有自己的 Java 虚拟机栈。例如,在执行主方法时,主线程用于存储在主方法中定义的局部变量。



例如,在上面的 main()方法中,实际上有一个名为“user1”的局部变量,它引用了 user1 的一个实例对象和一个名为“i”的局部变量。下图显示:



因为它是一个堆栈,所以遵循“先进先出”的原则。当方法被执行时,堆栈帧将从堆栈中出来,局部变量信息将从内存中删除。所以局部变量是线程安全的。因为只有当前线程才能获得这个值。


问:为什么要使用后进先出的数据结构?


答:假设方法 A 调用方法 B,首先对方法 A 的堆栈进行叠加,然后对方法 B 进行叠加。方法 B 执行后,方法 B 的堆栈帧首先退出堆栈,然后继续执行方法 A,然后方法 A 的堆栈帧退出堆栈。所以使用后进先出的堆栈结构是完美的。?

堆空间

或者上面的代码。当主线程执行 main()方法时,它首先在堆内存中实例化 user1 对象,然后在局部变量中创建 user1。user1 存储实例化的 user1 对象的内存地址。然后执行学生对象的 getname()方法。


如下:


堆外内存

实际上,在 JDK 的许多底层代码 API 中,比如 NIO。

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
JVM内存模型详解,java程序设计案例教程第二版答案