在本文中,我们将研究Java垃圾回收,它的工作方式以及重要性。
Java垃圾回收是Java程序执行自动内存管理的过程。Java程序编译为字节码,可以在Java虚拟机(简称JVM)上运行。当Java程序在JVM上运行时,将在堆上创建对象,这是专用于该程序的内存的一部分。最终,将不再需要某些对象。垃圾收集器找到这些未使用的对象并将其删除以释放内存。
Java垃圾收集是一个自动过程。程序员不需要显式标记要删除的对象。垃圾回收实现位于JVM中。每个JVM都可以实现垃圾回收,但是它很高兴。唯一的要求是它符合JVM规范。尽管有许多JVM,但Oracle的HotSpot是迄今为止最常见的。它提供了一套强大而成熟的垃圾收集选项。
尽管HotSpot具有针对各种用例进行了优化的多个垃圾收集器,但其所有垃圾收集器都遵循相同的基本过程。第一步,识别未引用的对象并将其标记为可进行垃圾回收。第二步,删除标记的对象。(可选)可以在垃圾回收器删除对象之后压缩内存,以便剩余的对象在堆开始时位于连续的块中。压缩过程使在分配给现有对象的内存块之后更容易按顺序将内存分配给新对象。
HotSpot的所有垃圾收集器都实现了按年龄分类对象的分代垃圾收集策略。世代垃圾收集背后的基本原理是,大多数对象都是短暂的,并且在创建后不久就可以进行垃圾收集了。
堆分为三个部分:
在完全垃圾收集事件期间,所有代中未使用的对象将被垃圾收集。
HotSpot有四个垃圾收集器:
Java垃圾收集的最大好处是,它可以自动处理未使用的对象或无法访问的对象的删除, 以释放重要的内存资源。使用无垃圾收集的语言(例如C和C ++)工作的程序员必须在其代码中实现手动内存管理。
尽管需要额外的工作,但一些程序员还是主张手动内存管理胜于垃圾回收,这主要是出于控制和性能方面的考虑。尽管有关内存管理方法的争论仍在继续,但垃圾收集现在已成为许多流行编程语言的标准组成部分。对于垃圾收集器会对性能产生负面影响的方案,Java提供了许多选项来调整垃圾收集器以提高其效率。
对于许多简单的应用程序,Java垃圾回收不是程序员需要自觉考虑的事情。但是,对于希望提高Java技能的程序员来说,了解Java垃圾回收的工作方式以及如何对其进行调整非常重要。
除了垃圾收集的基本机制外,了解Java中垃圾收集的最重要要点之一是它不是确定性的,无法预测运行时何时进行垃圾收集。可以在代码中包含一个提示,以使用System.gc()或Runtime.gc()方法运行垃圾收集器,但它们不能保证垃圾收集器会真正运行。
调整Java垃圾收集的最佳方法是在JVM上设置标志。标志可以调整要使用的垃圾收集器(例如,Serial,G1等),堆的初始和最大大小,堆段的大小(例如,Young Generation,Old Generation)等等。被调整的应用程序的性质是很好的设置初始指南。例如,并行垃圾收集器效率很高,但经常会导致“世界停止”事件,使其更适合后端处理,在这种情况下可以长时间停顿垃圾收集。
另一方面,CMS垃圾收集器旨在最大程度地减少暂停,使其非常适合响应性很重要的GUI应用程序。可以通过更改堆或堆的大小并使用jstat之类的工具测量垃圾收集效率来完成其他微调。