返回

JVM 内存模型与垃圾回收:去伪存真

Android

关于 JVM 内存模型以及垃圾回收的文章网上有很多,自己以前也看过很多,但是却从来也没有系统的去了解学习过,这次正巧再看周志明老师的《深入理解 Java 虚拟机》,内容非常棒,所以自己就花了点时间,认真系统的学习了一遍。

这篇文章主要简单记录分享一下关于 JVM 内存模型、内存溢…

关于 JVM 内存模型和垃圾回收,网上的文章数不胜数,但我却从来没有系统地学习过。这次,恰逢我阅读周志明老师的《深入理解 Java 虚拟机》,内容十分精彩,于是我花时间认真学习了一遍。

在这篇文章中,我将分享我对 JVM 内存模型和垃圾回收的理解。内容涉及:

  • JVM 内存模型
  • 垃圾回收算法
  • 分代收集器

JVM 内存模型

JVM 内存模型定义了 Java 程序在运行时如何组织和管理内存。它将内存划分为不同的区域,每个区域都有其特定的用途和生命周期。

栈内存

栈内存用于存储局部变量、方法调用信息和返回值。它是一个后进先出的(LIFO)数据结构,即后压入的元素先弹出。当方法被调用时,会在栈中创建一个栈帧,用于存储方法的局部变量和返回地址。当方法返回时,栈帧被弹出,局部变量被销毁。

堆内存

堆内存用于存储对象实例。它是一个非结构化的区域,对象可以在其中被分配和回收。对象引用存储在栈内存中,而对象本身存储在堆内存中。

方法区

方法区用于存储类信息、方法代码和常量。它在 Java 8 之前被称为永久代,但在 Java 8 中被元空间取代。元空间是一个基于本地内存的区域,用于存储类元数据。

垃圾回收

垃圾回收是 JVM 自动回收不再使用的对象内存的过程。当对象不再被任何引用指向时,它就成为垃圾对象。JVM 会定期运行垃圾回收器来识别和回收垃圾对象,释放内存空间。

垃圾回收算法

有许多不同的垃圾回收算法,各有优缺点。最常见的算法包括:

  • 标记-清除算法: 标记所有可达对象,然后清除未标记的对象。
  • 标记-整理算法: 标记所有可达对象,然后将它们整理到内存的连续区域中,释放中间的空闲空间。
  • 复制算法: 将可达对象复制到一个新的内存区域,然后丢弃旧的区域。

分代收集器

分代收集器将堆内存划分为不同的代,每个代都有其特定的垃圾回收算法。最常见的代包括:

  • 新生代: 存储新创建的对象。新生代通常使用复制算法,因为新创建的对象很可能很快就会被回收。
  • 老年代: 存储长期存活的对象。老年代通常使用标记-清除算法或标记-整理算法。
  • 永久代/元空间: 存储类信息和常量。永久代/元空间通常使用标记-清除算法。

总结

JVM 内存模型和垃圾回收是 Java 虚拟机中至关重要的概念。理解这些概念对于优化 Java 应用程序的性能和可靠性至关重要。通过使用不同的垃圾回收算法和分代收集器,JVM 可以高效地管理内存并回收不再使用的对象。