Types of Garbage Collector in Java2025年5月2日 | 阅读 5 分钟 在 Java 中,垃圾回收是一种提供自动内存管理的机制。它由 JVM 完成。程序员无需处理对象的分配和释放。在前面的章节中,我们还讨论了垃圾回收的工作原理。 如果您还不熟悉垃圾回收,我们建议您首先了解垃圾回收、Java 堆和内存管理。在本节中,我们将讨论Java 中垃圾回收的类型。 垃圾回收器类型Java 中有四种垃圾回收器,可以根据需要使用。
每种垃圾回收器的性能和工作方式完全不同。它们各有优缺点。Java 允许我们选择 JVM 使用的任何一种垃圾回收器。要选择 GC,我们需要传递 JVM 参数。选择适合应用程序的垃圾回收器很困难。让我们逐一讨论每种垃圾回收器。 ![]() 串行垃圾回收器串行垃圾回收器非常适合单线程环境。它只使用一个线程进行垃圾回收。它通过暂停应用程序的所有线程来工作。这意味着在垃圾回收过程中,应用程序的线程会由串行垃圾回收器冻结,这个过程称为Stop the World 事件。避免在服务器环境中使用串行 GC。我们可以将其用于简单程序。如果要使用串行垃圾回收器,请执行 -XX:+UseSerialGC JVM 参数来激活它。 ![]() 并行垃圾回收器并行垃圾回收器是 JVM 使用的默认 GC。并行垃圾回收器的工作方式与串行垃圾回收器相同。串行和并行垃圾回收器之间的唯一区别是,串行垃圾回收器在垃圾回收过程中使用一个线程,而并行垃圾回收器使用多个线程进行垃圾回收。Parallel GC 可以利用多个 CPU 来加快应用程序吞吐量。因此,它也被称为吞吐量收集器。如果我们要执行长时间运行的进程(例如批处理),并且可以接受长时间的暂停,则使用它。如果要使用并行垃圾回收器,请执行 -XX:+UseParallelGC JVM 参数来激活它。 ![]() 我们还可以使用以下 JVM 参数来配置并行 GC:
*暂停时间:两次 GC 之间的时间间隔。 **吞吐量目标:垃圾回收期间花费的时间与非垃圾回收期间花费的时间之比称为吞吐量目标。 并发标记清除 (CMS) 垃圾回收器CMS 使用多个线程扫描堆,并在扫描过程中标记要清除的实例,扫描完成后,清除标记的实例。它在垃圾回收期间不会暂停应用程序的线程。GC 线程与应用程序线程并发执行。因此,与其他 GC 相比,它使用更多的 CPU。它也被称为低暂停并发收集器。仅当满足以下两种情况时,它才会冻结应用程序的所有线程:
我们可以使用多个 CPU 来获得更好的应用程序吞吐量。如果有更多的 CPU 可用,我们应该使用 CMS 垃圾回收器。因此,它比并行垃圾回收器具有优势。如果要使用 CMS 垃圾回收器,请执行 -XX:+USeParNewGC JVM 参数来激活它。我们还可以使用 -XX:ParallelCMSThreads=<n> JVM 参数来设置 GC 线程的数量。 ![]() 注意:JVM 参数 -XX:+UseConcMarkSweepGC 已被弃用,因为它在命令行请求时会发出警告消息。垃圾优先 (G1) 垃圾回收器当内存(堆空间)很大(超过 4GB)时,可以使用 G1 垃圾回收器。它将堆分成大小相等的块(通常为 1MB 到 32MB),对它们进行优先级排序,然后根据优先级对这些块执行并行垃圾回收。 Eden、Survivor 和 Old 区域使用这种大小相等的区域来分配对象内存。除了这些内存区域,G1 GC 中还有另外两种类型的区域:
![]() G1 GC 显示一个并发全局标记阶段,以确定整个堆中的活动对象和死对象。标记阶段完成后,G1 收集包含最多垃圾对象的区域的信息。然后先清除这些区域。如果要使用 G1 垃圾回收器,请执行 -XX:+UseG1GC JVM 参数来激活它。 Stop the World 事件这是一种情况,当垃圾回收器执行垃圾回收 (GC) 时,它会停止所有应用程序线程,直到 GC 过程完成。这个过程称为Stop the World (STW) 事件。 Java 8 以来垃圾回收器的改进在 Java 8 中,G1 垃圾回收器得到了更新。更新后的 GC 提供了 -XX:+UseStringDeduplication JVM 参数,该参数可以优化堆内存。它将重复的 String 值删除到单个 char[] 数组。 垃圾回收 JVM 选项Java 垃圾回收的关键选项如下: JVM 参数该表描述了可以用来指示 JVM 的参数。
GC 优化选项
JVM GC 选项的用法我们已经讨论了所有四种类型的 Java 垃圾回收器。但是选择一个很难,因为它取决于应用程序场景、硬件可用性和吞吐量要求。 |
“省份数量”问题涉及查找表示为无向图节点的连通城市组。一个城市组(省份)包括直接或间接连接的城市。此 Java 程序使用深度优先搜索 (DFS) 或并查集等算法来识别和计算这些连通...
阅读 13 分钟
数字签名是一种验证数字消息和文档权威性的机制。它因提供比其他签名更高的安全性而非常受欢迎。在 Java 中,使用 JDK 安全 API 来创建和实现数字签名。在本节中,我们将...
阅读 12 分钟
在 Java 中使用下划线(_)作为变量名一直是开发者讨论的话题,这主要是由于其在 Java 语言约定中的演变及其对可读性、遵循约定和最佳实践的影响。以下是关于使用下划线作为变量名的详细探讨……
阅读 3 分钟
右截断素数无论从右向左连续删除数字,都会保持其素数状态,最终剩下一个个位素数。739 符合右截断素数条件,因为从 739 开始,我们先得到 73,然后得到 7,它们都是素数……
阅读 6 分钟
我们可以通过 reverse()、split()、toLowerCase()、toUpperCase() 和 substring() 方法来反转字符串中每个单词的大小写。通过 split("\\s") 方法,我们可以将所有单词获取到一个数组中。要获取第一个字符,我们可以使用 substring() 或 charAt()...
阅读1分钟
什么是身份验证?身份验证是验证用户提供的凭据是否与系统中存储的凭据匹配的过程,以证明用户就是他们所说的那个人。如果凭据匹配,则授予访问权限。如果不匹配,则拒绝访问。身份验证方法单因素身份验证:这是...
阅读 6 分钟
在数论中,没有什么比 Hardy-Ramanujan 定理更迷人的了。它展示了数字在素因子方面的分布有多么真实。Hardy 在 1917 年基于 Srinivasa Ramanujan 的观察讨论了该定理,该定理认为 ω(n) = 个数...
5 分钟阅读
问题陈述该任务涉及计算给定矩阵中所有升序或降序排列的行。如果一行中的所有元素都遵循既不递减(升序)也不递增的模式,则该行被视为已排序。例如,[1,2,3,4] 是升序排列。关于...
阅读 4 分钟
Giuga 数是一个合数 N,它具有一个独特的属性。该属性指出,对于 N 的每个素数因子 p,N 除以 p 减 1((N/p) - 1)也必须能被 p 整除。如果一个数 N 满足这个条件...
5 分钟阅读
Java 库中已有的异常被称为内置异常。这些异常可以定义错误情况,以便我们理解出现此错误的原因。内置异常的类型内置异常有两种:检查异常和非检查异常。检查异常 检查...
阅读 8 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India