Java 入门指南:初识 JVM Java虚拟机(Java Virtual Machine)

文章目录

      • 引言
      • JVM架构
        • [类加载器子系统(Class Loader Subsystem)](#类加载器子系统(Class Loader Subsystem))
        • [运行时数据区(Runtime Data Area)](#运行时数据区(Runtime Data Area))
        • [执行引擎(Execution Engine)](#执行引擎(Execution Engine))
        • [垃圾回收器(Garbage Collector)](#垃圾回收器(Garbage Collector))
      • 内存管理
      • 垃圾回收机制
      • 性能调优
      • 总结

引言

Java虚拟机(JVM)是一种抽象计算模型,它在软件层面模拟了一个计算机 ,允许开发者编写平台无关的程序。Java程序被编译成一种中间表示------字节码(Bytecode),然后由 JVM 解释执行或通过即时编译器 (JIT)转换为本地机器码运行。这一特性使得Java应用可以在任何安装了JVM 的操作系统上运行,真正实现了"一次编写,到处运行"的目标。

JVM架构

JVM通常被划分为几个主要部分:

类加载器子系统(Class Loader Subsystem)

类加载器负责从文件系统或其他来源加载字节码到JVM中。它包括引导类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)以及应用程序类加载器(Application ClassLoader)。每个类加载器都有自己的职责范围,且类加载器之间形成了一个层次结构。

运行时数据区(Runtime Data Area)

这部分包含了方法区 (Method Area)、 (Heap)、 (Stack)、本地方法栈 (Native Method Stack)以及程序计数器(Program Counter Register)。

  • 方法区:存储每个类的信息(包括常量、静态变量、即时编译后的代码等)。
  • :所有线程共享的一块内存区域,在对象实例化时分配空间。
  • :每个线程拥有自己的私有栈,用来存储局部变量、操作数栈、动态链接、方法出口信息等。
  • 本地方法栈 :与Java栈类似,但为 JVM 使用到的 Native 方法服务。
  • 程序计数器:当前线程所执行的字节码的指示器。
执行引擎(Execution Engine)

执行引擎读取方法区中的字节码指令,并解释执行或通过 JIT 编译器将其转换为本地机器码。

垃圾回收器(Garbage Collector)

JVM 的垃圾回收器负责管理和回收不再使用的对象所占用的内存。

垃圾回收器的工作原理通常包括以下几个步骤:

  1. 标记(Mark):从根对象(如全局变量、活动栈等)开始,遍历程序对象的引用链,将可达的对象标记为"存活"。
  2. 清除(Sweep):遍历整个堆内存,将未被标记为"存活"的对象当作垃圾,将其所占用的内存空间释放出来。
  3. 压缩(Compact)(可选):清除阶段可能会留下大量不连续的内存空间碎片。为了解决这个问题,垃圾回收器会进行内存压缩操作,将存活对象紧凑地排列在一起,使得内存空间得到整理。
  4. 再分配(Reallocate):经过压缩后,垃圾回收器会记录下可用的内存空间,并将这些空间划分为一系列更小的块,以备后续的对象分配使用。

不同的垃圾回收算法有不同的实现策略,如分代收集复制算法标记-整理算法等。

内存管理

内存管理是JVM的重要组成部分之一,它涉及如何分配和回收内存资源。JVM提供了几种不同的内存区域,每种区域都具有特定的用途和管理方式。

堆内存

堆内存是最主要的内存区域,它存放着所有的Java对象实例和数组。对象的创建和销毁都在这里发生。为了提高效率,JVM会根据对象的生命周期将其分为新生代 (Young Generation)和老年代(Old Generation)。

  • 新生代 :主要包含 Eden 区和两个 Survivor 区(S0和S1)。对象首先在 Eden 区创建,当 Eden 区满时触发 Minor GC,存活的对象会被移动到一个 Survivor 区,经过多次 GC 后仍然存活的对象会被晋升到老年代。
  • 老年代 :存放较长时间存活的对象。当老年代空间不足时,会触发 Major GCFull GC
方法区

方法区 (Method Area),有时也被称为非堆区 (Non-Heap Area),它用于存储每个类的信息,如类的结构数据静态变量常量池 (Constant Pool)、即时编译后的代码等。在Java虚拟机规范中,方法区与Java堆一样,都是线程共享的区域。

方法区主要存储了以下内容:

  • 类的元数据:包括类名、方法名、字段等信息。
  • 静态变量:类级别的变量。
  • 常量池:包括类或者接口的字面量(Literal)和符号引用(Symbolic References)。
  • 即时编译后的代码:JIT编译器编译后的本地代码缓存。

垃圾回收机制

垃圾回收是JVM自动管理内存的核心机制。JVM使用不同的算法来检测和回收不再使用的对象:

  • 引用计数法:简单直观,但由于无法处理循环引用的问题,在JVM中并不常用。
  • 可达性分析算法:通过一系列名为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,如果一个对象到GC Roots没有任何引用链相连,则证明此对象是不可用的。
  • 分代假设:基于大多数对象很快就会变得不可达的事实,JVM将堆分为几代,并采用不同的回收策略。

性能调优

性能调优是 JVM 应用中不可避免的话题。通过对 JVM 参数的调整,可以显著提升应用程序的性能。常见的调优方向包括但不限于:

  • 调整堆大小,平衡新生代和老年代的比例。
  • 选择合适的垃圾回收器。
  • 启用或禁用某些 JIT 编译选项。
  • 使用工具如 VisualVM 来监控 JVM 运行时的状态,找出瓶颈所在。

总结

JVM作为一个强大的执行环境,不仅支撑了Java语言的发展,也为其他语言提供了运行平台。随着技术的进步,JVM也在不断地发展和完善,以适应更多复杂的应用场景。

相关推荐
解孔明几秒前
IDEA2023.1添加java虚拟机启动参数,打开断言
java·开发语言
关关不烦恼3 分钟前
【Java数据结构】二叉树
java·开发语言·数据结构
苹果酱05673 分钟前
使用 React Testing Library 测试自定义 React Hooks
java·开发语言·spring boot·后端·中间件
好奇的菜鸟13 分钟前
Java技术体系:深入理解JDK与JRE及其产品线
java·开发语言
api7720 分钟前
1688商品详情API返回值中的售后保障与服务信息
java·服务器·前端·javascript·python·spring·pygame
界面开发小八哥44 分钟前
「Qt Widget中文示例指南」如何实现一个系统托盘图标?(二)
开发语言·c++·qt·用户界面
2301_775602381 小时前
二进制读写文件
开发语言
疑惑的杰瑞1 小时前
[乱码]确保命令行窗口与主流集成开发环境(IDE)统一采用UTF-8编码,以规避乱码问题
java·c++·vscode·python·eclipse·sublime text·visual studio
自身就是太阳1 小时前
深入理解 Spring 事务管理及其配置
java·开发语言·数据库·spring
喵手1 小时前
Java零基础-多态详解
java·开发语言·python