面试小札:JVM虚拟机

  1. 定义与基本概念
  • JVM(Java Virtual Machine)即Java虚拟机,是Java程序的运行核心。它是一个虚构出来的计算机,通过在实际的计算机上仿真模拟各种计算机功能来运行Java字节码。字节码是一种中间格式,它使得Java程序能够实现"一次编写,到处运行"的特性。
  1. 运行机制
  • 类加载机制

  • 包括加载、验证、准备、解析和初始化这几个阶段。加载阶段是将类的字节码文件加载到内存中;验证阶段是确保字节码文件的正确性和安全性;准备阶段是为类的静态变量分配内存并设置默认初始值;解析阶段是将符号引用转换为直接引用;初始化阶段是执行类构造器方法,对类的静态变量进行赋值操作。

  • 执行引擎

  • 它负责执行字节码指令。有多种执行方式,如解释执行和即时编译(JIT)。解释执行是逐行解释字节码并执行,速度相对较慢。JIT编译器会在程序运行过程中,将热点代码(经常被执行的代码)编译成机器码,这样后续执行这些代码时就可以直接以机器码的速度运行,大大提高了执行效率。

  1. 内存结构
  • 程序计数器

  • 是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在多线程环境下,每个线程都有自己独立的程序计数器,用于记录当前线程执行的位置,这样当线程切换回来时能够知道从哪里继续执行。

  • Java虚拟机栈

  • 每个Java方法在执行时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。随着方法的调用和返回,栈帧在虚拟机栈中入栈和出栈。它是线程私有的,生命周期与线程相同。

  • 本地方法栈

  • 与Java虚拟机栈类似,不过它是为本地(Native)方法服务的,本地方法是用其他语言(如C、C++)编写并通过JNI(Java Native Interface)调用的方法。

  • 堆

  • 是Java虚拟机所管理的内存中最大的一块,它是所有线程共享的区域。主要用于存放对象实例和数组。垃圾收集器主要就是回收堆中不再使用的对象占用的空间,以避免内存泄漏。

  • 方法区

  • 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。它也是各个线程共享的内存区域。在Java 8之后,永久代(PermGen)被元空间(Metaspace)取代,元空间使用本地内存,而不是虚拟机内存。

  1. 垃圾回收(GC)
  • JVM的垃圾回收机制自动回收不再使用的对象所占用的内存空间。有多种垃圾回收算法,如标记 - 清除算法、复制算法、标记 - 整理算法等。不同的垃圾回收器会采用不同的算法组合。例如,Serial GC是一个单线程的垃圾回收器,适合于单核CPU的小型应用;Parallel GC是多线程的垃圾回收器,可以提高垃圾回收的效率;CMS(Concurrent Mark Sweep)GC是一种以获取最短回收停顿时间为目标的垃圾回收器,适用于对响应时间要求较高的应用。
  1. 重要性和应用场景
  • JVM的存在使得Java语言具有高度的可移植性,开发人员可以专注于编写代码,而不用担心底层操作系统和硬件的差异。它广泛应用于企业级应用开发、安卓应用开发(Android使用了经过改造的JVM)、大数据处理(如Hadoop生态系统中的部分组件)等众多领域。
相关推荐
hai_android13 小时前
LruCache 图片浏览器内存缓存
android·java·kotlin
玩美移动13 小时前
AI Skin Analysis API 技术解析:文件上传、异步任务与结果读取
java·人工智能·python
我是小白呀14 小时前
19-Temporal项目实战:将客户开通流程迁移到持久执行架构
java·开发语言·人工智能·架构·workflow
步行cgn14 小时前
Spring 负责注入的注解详解
java·sql·spring
摇滚侠14 小时前
《On Java 中文版 基础卷》阅读笔记 安装 Java 和本书示例 02
java·开发语言·笔记
许彰午14 小时前
53-审计三表
java·低代码·架构
重生之小比特14 小时前
【C++进阶】红黑树的实现
java·开发语言·c++
程序猿乐锅14 小时前
【黑马点评 | 第九篇】秒杀优化-异步实现
java·spring boot·redis·后端·spring·中间件·mybatis
FYKJ_201016 小时前
springboot助农产品销售商城05829-计算机课程设计、毕业设计
java·spring boot·python·mysql·spark·django
user_admin_god18 小时前
第 10 篇:拼上下文与生成——预算、边界与防幻觉
java·人工智能·spring boot·语言模型