• Java 基础面试题,JVM 内存模型?


    我们在 Java 岗位的面试题中,大概率会碰到这样一个面试题:请你解释你对 JVM 内存模型的理解。

    今天我们就来回答一下这个问题:

    JDK 11 中的 JVM 内存模型可以分为以下几个部分:

    JVM 内存模型

    1. 程序计数器(Program Counter):
      • 作用:记录当前线程执行的字节码指令的地址。
      • 描述:在多线程环境下,每个线程都有自己的程序计数器,用于指示线程当前执行的指令位置。
    2. Java 虚拟机栈(Java Virtual Machine Stack):
      • 作用:存储方法的局部变量、方法参数、返回值和部分中间结果。
      • 示例:在方法调用过程中,局部变量和方法参数都会存储在虚拟机栈中。
    3. 本地方法栈(Native Method Stack):
      • 作用:与 Java 虚拟机栈类似,但用于执行本地方法(Native Method)。
      • 描述:当调用本地方法时,相关的局部变量和参数会存储在本地方法栈中。
    4. Java 堆(Java Heap):
      • 作用:存储对象实例和数组。
      • 描述:在 Java 代码中,通过 new 关键字创建的对象都会存储在Java堆中。
    5. 方法区(Method Area):
      • 作用:存储类的结构信息、常量、静态变量、即时编译器编译后的代码等。
      • 描述:在 Java 代码中,类的信息和静态变量都会存储在方法区中。
    6. 运行时常量池(Runtime Constant Pool):
      • 作用:存储编译期生成的各种字面量和符号引用。
      • 描述:在 Java 代码中,字符串常量和类、方法的符号引用都会存储在运行时常量池中。
    7. 直接内存(Direct Memory):
      • 作用:与 Java 堆类似,也是存储对象的内存区域,但不受 Java 堆大小的限制。
      • 描述:在使用 NIO(New Input/Output)库时,可以使用直接内存来提高 IO 操作的性能。

    下面我们以一个具体的 Java 代码示例,分析每个部分中存放的数据:

    public class MemoryModelExample {
        private static int staticVariable = 10;
        private int instanceVariable = 20;
    
        public void method(int parameter) {
            int localVariable = 30;
            String str = "Hello";
    
            // ...
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 程序计数器:存放当前线程执行的字节码指令的地址。
    • Java 虚拟机栈:存放 method 方法的局部变量 parameterlocalVariable
    • 本地方法栈:在这个示例中,没有调用本地方法,所以本地方法栈中不存放任何数据。
    • Java 堆:存放 MemoryModelExample 类的实例对象和相关的实例变量。
    • 方法区:存放 MemoryModelExample 类的结构信息、静态变量 staticVariable 和常量池中的字符串常量。
    • 运行时常量池:存放字符串常量 "Hello" 和类、方法的符号引用。
    • 直接内存:在这个示例中,没有使用直接内存,所以直接内存中不存放任何数据。

    这样,我们可以根据Java代码的结构和特点,分析每个部分中存放的具体数据。需要注意的是,具体的内存分配和数据存储可能会受到 JVM 的具体实现和优化策略的影响。

    我整理了从基础到高级的上百道面试题,点击下方链接领取:

    2023,大厂面试题,从基础到高级

  • 相关阅读:
    软件工程毕业设计课题(8)基于python的毕业设计python共享图片分享系统毕设作品源码
    javaEE和javaSE
    管理Linux的软件包和进程
    cordova 使用
    Oracle-后端命令行
    java-net-php-python-jsp学生会人事管理信息系统计算机毕业设计程序
    常见弯道输送机有哪些
    linux系统使用达梦数据库
    Golang处理gRPC请求/响应元数据
    轻松合并视频,一键为视频添加封面,打造个性化批量剪辑!
  • 原文地址:https://blog.csdn.net/Prepared/article/details/134075042