Java 中的垃圾回收机制如何工作?17 Mar 2025 | 6 分钟阅读 在Java 中,垃圾回收是一种自动管理内存的过程。它会查找未使用的对象(即程序不再使用的对象)并将其删除或移除,以释放内存。垃圾回收机制使用了多种 GC 算法。其中最常用、最流行的算法是标记-清除。 在本节中,我们将学习对象何时符合垃圾回收的条件、垃圾回收的类型以及标记-清除算法。此外,我们还将理解Java 中的垃圾回收机制是如何工作的? 垃圾回收器概述当程序在 Java 中执行时,它会以不同的方式使用内存。堆(heap)是对象存在的内存区域。它是唯一参与垃圾回收过程的内存部分。它也被称为可回收堆。所有垃圾回收都确保堆尽可能地拥有空闲空间。垃圾回收器的功能是查找并删除无法访问的对象。 关于垃圾回收器要点
对象分配当对象被分配时,JRockit JVM 会检查对象的大小。它区分小对象和大对象。大小的区分取决于 JVM 的版本、堆大小、垃圾回收策略以及使用的平台。对象的大小通常在 2 到 128 KB 之间。 小对象存储在线程本地区域(TLA),这是堆中的一个空闲块。TLA 不与其他线程同步。当 TLA 变满时,它会请求新的 TLA。 另一方面,不适合直接放入 TLA 的大对象会直接分配到堆中。如果一个线程正在使用年轻代,那么它会直接存储在老年代。大对象需要线程之间更多的同步。 对象何时符合垃圾回收条件?如果一个对象不再被任何程序、线程、静态引用或其引用为 null 所使用,那么它就符合垃圾回收的条件。如果两个对象相互引用(循环引用)但没有任何活动的引用,那么这两个对象都会被垃圾回收器回收。在其他一些情况下,对象也符合垃圾回收的条件:
Java 垃圾回收器做什么?JVM 控制垃圾回收器。JVM 决定何时执行垃圾回收。你也可以请求 JVM 运行垃圾回收器。但在任何情况下,都不能保证 JVM 会遵守。当 JVM 检测到内存不足时,它会运行垃圾回收器。当 Java 程序请求垃圾回收器运行时,JVM 通常会很快地响应请求。它不保证请求一定会被接受。 需要理解的关键点是“对象何时符合垃圾回收条件?” 每个 Java 程序都有多个线程。每个线程都有其执行栈。在 Java 程序中运行的一个线程是 main() 方法。现在我们可以说,当没有活动的线程能够访问一个对象时,该对象就符合垃圾回收条件。垃圾回收器将该对象视为可删除的对象。如果一个程序有一个引用变量指向一个对象,并且该引用变量可以被活动的线程访问,那么这个对象被称为可达对象。 这时会产生一个问题:“Java 应用程序会耗尽内存吗?” 答案是肯定的。垃圾回收系统会尝试在对象不再使用时将其从内存中移除。尽管如此,如果你维护了大量活动的(live)对象,垃圾回收并不能保证有足够的内存。只有可用的内存会被有效地管理。 垃圾回收的类型有五种类型的垃圾回收,如下所示:
标记和清除算法JRockit JVM 使用标记-清除算法进行垃圾回收。它包含两个阶段:标记阶段和清除阶段。 标记阶段:从线程、本地句柄和其他 GC 根源可访问的对象被标记为活动的。每个对象树都有一个或多个根对象。GC 根始终是可达的。所以,任何具有垃圾回收根的对象都与根相关联。它识别并标记所有正在使用的对象,其余的可以被认为是垃圾。 ![]() 清除阶段:在此阶段,遍历堆以查找活动对象之间的空隙。这些空隙被记录在空闲列表中,可用于新对象的分配。 标记-清除算法有两种改进版本:
并发标记-清除它允许线程在垃圾回收的大部分过程中继续运行。有以下几种标记方式:
并行标记-清除它利用系统中所有可用的 CPU 来尽可能快地执行垃圾回收。它也被称为并行垃圾回收器。当并行垃圾回收执行时,线程不会执行。 标记-清除的优点
标记-清除的缺点
下一主题打开对话框 |
什么是面向对象编程 (OOP)?面向对象编程具有广泛的影响,因为它在多个层面都很有吸引力,并有望实现更快、更便宜的开发和维护。它遵循自下而上的方法来开发应用程序。在本节中,我们将深入讨论什么是面向对象编程?面向对象编程 词语“面向对象”...
阅读 6 分钟
在 Java 面试中,最常被问到的问题之一是 Java 中的停车场设计。Java 中的停车场设计是一个设计问题,涉及车辆如何在停车场中停放。它主要在 HLD...
7 分钟阅读
什么是 UUID? UUID 是通用唯一标识符 (Universally Unique Identifier) 的缩写。UUID 由 Open Software Foundation (OSF) 标准化。它是分布式计算环境 (DCE) 的一部分。UUID 是一个 36 个字符长的唯一编号。它也被称为全局唯一标识符 (GUID)。A 类 UUID...
阅读 4 分钟
在 Java 中,包在消除命名冲突、控制访问以及使类、枚举、接口和注释的搜索和使用更容易方面发挥着重要作用。为了将相关的类、接口和子包分组,我们使用包。通过使用包:非常...
阅读 3 分钟
在本教程中,我们将学习 Java 中的半素数。如果一个数 n 可以写成两个素数的乘积,则称 n 为半素数。在本教程中,我们将探讨如何...
5 分钟阅读
常量在编程中起着关键作用,因为它们允许开发人员为在程序执行期间保持不变的固定值分配有意义的名称。在 Java 中,一种广泛使用的面向对象编程语言,常量对于创建可维护和可读的代码至关重要。本文……
阅读 8 分钟
问题陈述在数组中找到一个索引,该索引处的值出现次数超过数组索引的一半是当前任务。这个数字通常被称为数组的多数元素。出现次数超过n/2次的元素...
5 分钟阅读
在面向对象编程中,一个存储和管理单个实例的类被称为“Mono Class”。这个概念与 Java 的 Singleton 设计模式一致,其中一个类提供了对单个实例的全局访问点并确保其生成。Singleton 设计...
阅读 4 分钟
在计算机网络领域,高效的数据传输是一个关键问题。滑动窗口协议是一种众所周知的技术,在确保发送方和接收方之间可靠且有序的数据交换方面发挥着重要作用。在本节中,我们将深入探讨...
阅读 4 分钟
嵌套初始化是 Java 中用于实现单例类的一种技术。单例类是指只允许存在一个实例的类。嵌套初始化技术确保即使在多线程...
阅读 6 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India