专注Java教育14年 全国咨询/投诉热线:444-1124-454
赢咖4LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 什么是JVM垃圾回收

什么是JVM垃圾回收

更新时间:2022-02-14 10:12:34 来源:赢咖4 浏览555次

Java垃圾回收的定义

Java 垃圾收集是 Java 程序执行自动内存管理的过程。Java 程序编译为可以在Java虚拟机或简称 JVM 上运行的字节码。当 Java 程序在 JVM 上运行时,对象是在堆上创建的,堆是专用于程序的一部分内存。最终,将不再需要某些对象。垃圾收集器找到这些未使用的对象并删除它们以释放内存。

Java 垃圾收集的工作原理

Java 垃圾收集是一个自动过程。程序员不需要显式标记要删除的对象。垃圾收集实现存在于 JVM 中。每个 JVM 都可以随心所欲地实现垃圾收集;唯一的要求是它符合 JVM 规范。尽管有许多 JVM,但 Oracle 的 HotSpot 是迄今为止最常见的。它提供了一套强大而成熟的垃圾收集选项。

虽然 HotSpot 有多个针对各种用例进行了优化的垃圾收集器,但它的所有垃圾收集器都遵循相同的基本流程。在第一步中,未引用的对象被识别并标记为准备好进行垃圾回收。第二步,删除标记的对象。可选地,可以在垃圾收集器删除对象后压缩内存,因此剩余的对象位于堆开始处的连续块中。压缩过程使得在分配给现有对象的内存块之后按顺序为新对象分配内存变得更加容易。

HotSpot 的所有垃圾收集器都实现了按年龄对对象进行分类的分代垃圾收集策略。分代垃圾回收背后的基本原理是大多数对象都是短暂的,并且在创建后很快就会为垃圾回收做好准备。

堆分为三个部分:

年轻代:新创建的对象从年轻代开始。年轻代进一步细分为一个 Eden 空间,所有新对象都从这里开始,还有两个 Survivor 空间,其中对象在经过一个垃圾回收周期后从 Eden 移出。当对象从年轻代被垃圾回收时,它是一个次要的垃圾回收事件。

老一代:长寿命的对象最终会从年轻一代移动到老一代。当对象从老年代被垃圾回收时,这是一个主要的垃圾回收事件。

永久代:类和方法等元数据存储在永久代中。不再使用的类可能会从永久代中被垃圾收集。

在完全垃圾收集事件期间,所有代中未使用的对象都将被垃圾收集。

HotSpot 有四个垃圾收集器:

串行:所有垃圾收集事件都在一个线程中串行进行。每次垃圾回收后都会执行压缩。

并行:使用多个线程进行次要垃圾收集。单个线程用于主要垃圾收集和老一代压缩。或者,Parallel Old 变体使用多个线程进行主要垃圾收集和 Old Generation 压缩。

CMS(并发标记扫描):使用与并行相同的算法使用多个线程进行次要垃圾收集。主要垃圾收集是多线程的,如 Parallel Old,但 CMS 与应用程序进程同时运行以最小化“停止世界”事件(即当垃圾收集器运行停止应用程序时)。不执行压缩。

G1(垃圾优先):最新的垃圾收集器旨在替代 CMS。它像 CMS 一样是并行和并发的,但与旧的垃圾收集器相比,它的工作原理完全不同。

Java 垃圾收集的好处

Java 垃圾回收的最大好处是它会自动处理删除未使用的对象或无法访问的对象 以释放重要的内存资源。使用没有垃圾收集的语言(如 C 和 C++)的程序员必须在其代码中实现手动内存管理。

尽管需要额外的工作,一些程序员还是赞成手动内存管理而不是垃圾收集,主要是出于控制和性能的原因。虽然关于内存管理方法的争论仍在继续,但垃圾收集现在已成为许多流行编程语言的标准组件。对于垃圾收集器对性能产生负面影响的场景,Java 提供了许多选项来调整垃圾收集器以提高其效率。

Java 垃圾回收最佳实践

对于许多简单的应用程序来说,Java 垃圾回收并不是程序员需要有意识地考虑的事情。但是,对于想要提高 Java 技能的程序员来说,了解 Java 垃圾收集的工作原理以及对其进行调整的方式非常重要。

除了垃圾收集的基本机制之外,了解 Java 中的垃圾收集最重要的一点是它是非确定性的,在运行时无法预测垃圾收集何时会发生。可以在代码中包含使用 System.gc() 或 Runtime.gc() 方法运行垃圾收集器的提示,但它们不能保证垃圾收集器将实际运行。

调整 Java 垃圾收集的最佳方法是在 JVM 上设置标志。标志可以调整要使用的垃圾收集器(例如 Serial、G1 等)、堆的初始和最大大小、堆部分的大小(例如年轻一代、老一代)等等。正在调整的应用程序的性质是一个很好的初始设置指南。例如,并行垃圾收集器很高效,但会经常导致“停止世界”事件,使其更适合后端处理,其中垃圾收集的长时间暂停是可以接受的。

另一方面,CMS 垃圾收集器旨在最大限度地减少暂停,使其非常适合响应性很重要的 GUI 应用程序。可以通过更改堆或其部分的大小以及使用 jstat 之类的工具测量垃圾收集效率来完成额外的微调。如果大家想了解更多相关知识,可以关注一下赢咖4的Java虚拟机视频,里面的课程内容细致全面,通俗易懂,适合小白学习,希望对大家能够有所帮助。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>