JVM 基础知识:深入理解 Java 的运行时环境!

举报
喵手 发表于 2025/08/24 21:20:21 2025/08/24
【摘要】 开篇语哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,...

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

Java 虚拟机(JVM)是 Java 程序能够实现平台独立性的关键,它是 Java 程序执行的核心。在 Java 程序运行时,JVM 执行字节码文件,管理内存、执行线程、垃圾回收等。理解 JVM 的工作原理,对于编写高效、稳定的 Java 程序至关重要。

本文将深入探讨 JVM 的基础知识,包括 JVM 内存结构、垃圾回收机制、类加载过程、JVM 参数调优和性能监控工具。

1. JVM 内存结构

JVM 的内存结构是 Java 程序执行时数据存储和管理的基础,主要分为以下几个区域:

1.1 程序计数器(Program Counter Register)

程序计数器(PC Register)是每个线程的私有内存区域,用于存储当前线程正在执行的字节码的地址。每当线程切换时,JVM 会根据程序计数器来恢复当前线程执行的代码位置。由于线程之间是并发执行的,因此每个线程都有独立的程序计数器。

1.2 Java 堆(Heap)

Java 堆是 JVM 中最大的一块内存区域,用于存储所有对象和数组。所有通过 new 关键字创建的对象都会分配到堆内存中。堆的管理是垃圾回收(GC)的主要目标区域。

  • 新生代:年轻代(Young Generation)是堆的一个区域,主要存储新创建的对象。大多数对象会在这个区域中被快速回收。
  • 老年代:老年代(Old Generation)存储那些生命周期较长的对象。经过多次垃圾回收的对象会被晋升到老年代。

1.3 方法区(Method Area)

方法区用于存储类信息、常量、静态变量和方法等数据。它也叫做永久代(PermGen),但在 Java 8 以后被 元空间(Metaspace) 替代。元空间不再使用堆内存,而是直接使用本地内存。

1.4 本地方法栈(Native Method Stack)

本地方法栈用于存储 JNI(Java Native Interface)调用的本地方法(即用其他语言编写的代码,如 C 或 C++)。每个线程都有自己的本地方法栈,用于执行与平台相关的操作。

1.5 栈(Stack)

每个线程都有自己的栈,它用于存储局部变量、方法调用的返回地址和方法执行过程中的中间结果。栈中的数据是线程私有的,随着方法的调用和返回自动入栈和出栈。

1.6 直接内存(Direct Memory)

直接内存并不属于 JVM 内存区域的一部分,但它是 Java NIO(New I/O)中使用的重要内存区域。它通过操作系统的本地内存(通过 sun.misc.Unsafe 类)进行直接的内存操作,避免了 JVM 堆内存的分配和复制。

2. 垃圾回收机制

JVM 的垃圾回收机制(Garbage Collection, GC)负责自动回收无用的对象,以释放内存。Java 程序员无需手动管理内存,但理解垃圾回收机制对于优化性能非常重要。

2.1 垃圾回收的基本原理

垃圾回收的基本思想是自动识别哪些对象不再被使用,并释放其占用的内存。常用的垃圾回收算法有:

  • 标记-清除算法:标记所有需要回收的对象,然后直接清除它们。简单但效率较低,因为标记和清除的过程中可能会产生内存碎片。
  • 复制算法:将内存分为两个区域,使用一个区域来分配新对象。当区域满时,将存活的对象复制到另一个区域,然后清空当前区域。减少了内存碎片,但需要额外的内存空间。
  • 标记-整理算法:标记对象并将存活对象整理到内存的一端,避免产生碎片。
  • 分代回收算法:JVM 根据对象存活的时间,将内存分为新生代和老年代。大多数对象会在新生代回收,而老年代则采用不同的回收策略。

2.2 垃圾回收器

JVM 提供了多种垃圾回收器,用于不同的回收策略和应用场景。常见的垃圾回收器包括:

  • Serial Garbage Collector:单线程回收,适用于资源有限的环境。
  • Parallel Garbage Collector:多线程回收,适用于多核机器,能够提高垃圾回收的效率。
  • CMS (Concurrent Mark-Sweep) Garbage Collector:并发标记清除,减少停顿时间,适合对响应时间有高要求的应用。
  • G1 Garbage Collector:分代收集器,适用于大内存环境,能够控制垃圾回收的停顿时间,避免长时间的停顿。

2.3 垃圾回收日志

通过 JVM 参数可以启用垃圾回收日志,帮助我们分析 GC 行为。常用参数如下:

-Xlog:gc*          # 打印所有 GC 日志
-XX:+PrintGCDetails # 打印详细 GC 信息
-XX:+PrintGCDateStamps # 打印 GC 时间戳

3. 类加载过程

类加载过程是指 JVM 将类的字节码文件加载到内存中并解析成类的实例的过程。类加载过程主要分为以下几个阶段:

3.1 类加载器(ClassLoader)

JVM 使用类加载器加载类,主要有三种类型的类加载器:

  • 引导类加载器(Bootstrap ClassLoader):负责加载 JDK 核心库,如 rt.jar 中的类。
  • 扩展类加载器(Extension ClassLoader):负责加载 ext 目录中的类。
  • 应用类加载器(Application ClassLoader):负责加载应用程序类路径中的类。

3.2 类加载过程

类加载过程主要包括以下几个步骤:

  1. 加载(Loading):通过类加载器加载类的字节码文件,生成一个 Class 对象。
  2. 验证(Verification):验证字节码的有效性,确保没有恶意代码。
  3. 准备(Preparation):为类的静态变量分配内存并赋默认值。
  4. 解析(Resolution):将符号引用(如类、方法、字段等)解析为直接引用。
  5. 初始化(Initialization):执行类的静态初始化块(static 块),并初始化静态变量。

3.3 类加载的双亲委派模型

Java 使用双亲委派模型来决定类加载的顺序。类加载器首先将加载请求交给父类加载器,如果父类加载器不能加载,则由当前加载器进行加载。这种方式有效避免了类加载冲突。

4. JVM 参数调优

JVM 参数调优用于优化 JVM 的性能,尤其是垃圾回收和内存管理。常见的 JVM 参数有:

4.1 堆内存参数

  • -Xms:设置 JVM 启动时堆的初始大小。
  • -Xmx:设置 JVM 最大堆内存大小。
  • -XX:NewSize:设置新生代的大小。
  • -XX:MaxNewSize:设置新生代的最大大小。
-Xms512m -Xmx1024m

4.2 垃圾回收器选择

  • -XX:+UseSerialGC:使用串行垃圾回收器。
  • -XX:+UseParallelGC:使用并行垃圾回收器。
  • -XX:+UseG1GC:使用 G1 垃圾回收器。

4.3 调整垃圾回收的停顿时间

  • -XX:MaxGCPauseMillis:设置垃圾回收的最大停顿时间。
  • -XX:GCTimeRatio:控制垃圾回收的时间占比。

4.4 其他调优参数

  • -XX:+PrintGCDetails:打印垃圾回收的详细信息。
  • -XX:+PrintGCDateStamps:打印 GC 事件的时间戳。
  • -XX:+UseConcMarkSweepGC:启用并发标记-清除垃圾回收。

5. 性能监控工具

Java 提供了多种工具来监控 JVM 的性能,帮助开发者定位瓶颈和优化应用程序。

5.1 jps(Java Virtual Machine Process Status Tool)

jps 命令可以列出当前所有运行的 JVM 进程。

jps

5.2 jstat(JVM Statistics Monitoring Tool)

jstat 用于查看 JVM 的内存和垃圾回收统计信息。

jstat -gc <pid>

5.3 jconsole

jconsole 是一个图形化的监控工具,能够实时查看 JVM 的堆内存、GC、线程等信息。

5.4 visualvm

visualvm 提供了 JVM 的可视化监控,支持查看内存、线程、垃圾回收等详细信息。

5.5 jprofiler

jprofiler 是一个强大的 Java 性能分析工具,可以用于分析内存泄漏、线程瓶颈等问题。

总结

理解 JVM 的基础知识对于编写高效的 Java 应用至关重要。掌握 JVM 内存结构、垃圾回收机制、类加载过程、JVM 参数调优和性能监控工具,可以帮助开发者优化应用程序的性能,确保程序在生产环境中的稳定性和高效性。通过合理调优 JVM,可以有效减少 GC 停顿时间,提高吞吐量,进而提升 Java 应用的性能和响应速度。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。