当前位置:首页 >热点 >JVM 与 GC 讲解,你学会了吗? 但同时也会引入一些性能开销

JVM 与 GC 讲解,你学会了吗? 但同时也会引入一些性能开销

2024-06-30 16:40:27 [百科] 来源:避面尹邢网

JVM 与 GC 讲解,讲解学你学会了吗?

作者:liugp 开发 前端 ull GC 的讲解学停顿时间较长,可能会对应用程序的讲解学性能和响应时间产生影响。因此,讲解学在设计和优化Java应用程序时,讲解学需要根据应用的讲解学需求和性能目标,合理配置堆内存大小、讲解学垃圾回收策略以及选择合适的讲解学垃圾回收器,以尽量减少Full GC的讲解学发生和影响。

一、讲解学概述

  • JVM(Java Virtual Machine)是讲解学一种在计算机上运行Java字节码的虚拟机。它允许Java程序在不同的讲解学操作系统上具有跨平台的能力,因为它提供了一个统一的讲解学运行环境。JVM 负责将Java源代码编译成字节码,讲解学然后在运行时解释执行或者编译执行这些字节码。讲解学
  • GC(Garbage Collection)是JVM的一个重要功能,用于自动管理内存。在Java中,开发人员不需要手动分配和释放内存,因为 GC 负责监测内存中不再使用的对象,并将它们自动回收以释放内存资源。这样可以减少内存泄漏和程序崩溃的风险,但同时也会引入一些性能开销。

GC 有不同的实现方式,其中两种主要的策略是:

  • 标记-清除(Mark and Sweep):这是最基本的垃圾回收算法。它首先标记所有仍然被引用的对象,然后清除那些没有被标记的对象,从而释放其占用的内存空间。这种方法可能导致内存碎片化问题,从而影响程序性能。
  • 分代垃圾回收(Generational Garbage Collection):根据对象的生命周期将内存分为不同的代(Generation),一般分为年轻代(Young Generation)和老年代(Old Generation)。大多数对象在短时间内就会变成垃圾,所以年轻代采用较短周期的GC策略,而老年代则采用更长周期的策略。常见的分代垃圾回收算法是G1(Garbage-First)垃圾回收器。

JVM 的 GC 对应用程序性能有着重要影响。频繁的 GC 事件可能导致应用程序的暂停时间增加,从而降低用户体验。为了优化 GC 性能,开发人员可以采取以下措施:

JVM 与 GC 讲解,你学会了吗? 但同时也会引入一些性能开销

  • 选择合适的GC算法和回收器:根据应用程序的性质和需求,选择适合的GC算法和回收器,如Serial GC、Parallel GC、Concurrent Mark-Sweep(CMS)GC、G1 GC等。
  • 调整堆内存大小:适当设置堆内存大小,避免过大或过小的堆对性能产生负面影响。
  • 避免创建过多临时对象:过多的临时对象会导致频繁的GC事件。可以重用对象或者使用对象池来减少临时对象的创建。
  • 优化对象的生命周期:尽量使对象的生命周期与其实际使用时间相符,避免长时间存活的对象进入年轻代,从而减少老年代的压力。
  • 监控和调优:使用 JVM 性能分析工具来监控 GC 事件,找出性能瓶颈并进行调优。

总之,理解 JVM 和 GC 的工作原理对于编写高性能、稳定的Java应用程序至关重要。

JVM 与 GC 讲解,你学会了吗? 但同时也会引入一些性能开销

二、JVM 内存模型

图片图片

JVM 与 GC 讲解,你学会了吗? 但同时也会引入一些性能开销

Java虚拟机(JVM)内存模型定义了Java程序在运行时如何使用计算机的内存资源。它将内存划分为不同的区域,每个区域用于存储不同类型的数据和执行不同的任务。以下是JVM内存模型的主要部分:

  • 方法区(Method Area):方法区是一个用于存储类结构信息、常量、静态变量、即时编译器编译后的代码等的区域。它在JVM启动时被创建,并且对于每个类加载器只存在一个方法区。在较早的JVM版本中,方法区被称为“永久代”(Permanent Generation),但在Java 8及以后的版本中,永久代被移除,而是用元空间(Metaspace)取代。
  • 堆(Heap):堆是Java程序运行时对象的主要存储区域。它被用来存储各种对象实例,包括用户自定义对象以及运行时创建的对象。堆被划分为新生代(Young Generation)和老年代(Old Generation)。新生代主要用于存放新创建的对象,老年代用于存放生命周期较长的对象。
  • 新生代:新生代又被划分为Eden空间和两个Survivor空间(通常称为S0和S1)。新创建的对象首先被分配到Eden空间,经过一些垃圾回收操作后,仍然存活的对象会被移动到Survivor空间,然后经过多次垃圾回收后,仍然存活的对象会被晋升到老年代。老年代:老年代主要用于存放经过多次垃圾回收仍然存活的对象,这些对象的生命周期较长。
  • 栈(Stack):栈被用来存储线程的局部变量、方法调用和返回信息。每个线程都有自己的栈空间,栈中的数据存储在栈帧中,每个方法调用会创建一个新的栈帧。栈是一个后进先出(LIFO)的数据结构。
  • 本地方法栈(Native Method Stack):本地方法栈与栈类似,但是它用于存储Java方法调用本地方法(用其他语言编写的方法)时的信息。
  • 程序计数器(Program Counter):每个线程都有一个程序计数器,它保存着线程正在执行的JVM指令的地址。在线程切换时,程序计数器的值会更新到新线程的执行位置。
  • 直接内存(Direct Memory):直接内存并不是JVM运行时数据区的一部分,但它与Java NIO(New I/O)相关。直接内存是通过ByteBuffer等NIO类分配的,实际上是在堆之外的内存,但是它由JVM管理。

JVM内存模型的理解对于编写高效且稳定的Java应用程序至关重要。通过对不同内存区域的管理和优化,可以提高应用程序的性能和可靠性。

三、GC算法和回收器

在Java虚拟机(JVM)中,垃圾回收(GC)是自动管理内存的机制,而垃圾回收涉及两个主要方面:垃圾回收算法和垃圾回收器。垃圾回收算法定义了如何判断哪些对象是垃圾以及如何回收它们,而垃圾回收器是实际执行垃圾回收算法的组件。

以下是一些常见的垃圾回收算法和垃圾回收器:

1)垃圾回收算法

  • 标记-清除(Mark and Sweep)算法:
  1. 首先,标记阶段标记所有可达的对象。
  2. 然后,清除阶段将未被标记的对象回收,释放内存空间。
  • 标记-整理(Mark and Compact)算法:
  1. 标记阶段与标记-清除算法相同,标记所有可达对象。

  2. 整理阶段将存活的对象移动到一侧,然后释放未被移动的内存。

  • 复制(Copying)算法:

  1. 将内存分为两个区域,通常是Eden和Survivor空间。

  2. 在每次垃圾回收时,将存活的对象从一个区域复制到另一个区域,然后清除原区域。

  • 增量式和并发式算法:

  1. 增量式垃圾回收:将垃圾回收过程分成多个阶段,在应用程序执行期间交替执行,减少停顿时间。

  2. 并发式垃圾回收:允许在应用程序执行时进行垃圾回收,从而减少停顿时间。

2)垃圾回收器

  • Serial 回收器:
  1. 单线程垃圾回收器,主要用于新生代。
  2. 使用复制算法进行垃圾回收。
  • Parallel 回收器:
  1. 多线程垃圾回收器,适用于多核处理器。

  2. 主要用于新生代,使用复制算法。

  • CMS(Concurrent Mark-Sweep)回收器:

  1. 并发垃圾回收器,用于老年代。

  2. 标记-清除算法,允许在应用程序执行时部分并发执行。

  • G1(Garbage-First)回收器:

  1. 面向大堆和低停顿时间的垃圾回收器。

  2. 使用标记-整理算法,将内存划分为多个区域,优先回收包含垃圾最多的区域。

  • ZGC和Shenandoah:

  1. 最小化停顿时间的垃圾回收器,适用于大堆。

  2. 使用不同的算法和技术来实现低停顿时间的垃圾回收。

每种垃圾回收算法和垃圾回收器都有其适用的场景和性能特点。选择适当的垃圾回收器取决于应用程序的需求,内存使用情况和性能目标。

四、垃圾回收机制(GC)

图片图片

Java垃圾回收机制是一种自动管理内存的机制,由Java虚拟机(JVM)负责。它的目标是通过检测和回收不再被程序引用的对象,释放内存并防止内存泄漏。以下是Java垃圾回收机制的主要特点:

  • 可达性分析:Java的垃圾回收机制基于可达性分析。JVM会从一组根对象(如全局变量、静态变量、活跃线程的局部变量等)开始,逐步遍历对象之间的引用关系,找到所有可达的对象。那些不可达的对象被认为是垃圾,可以被垃圾回收器回收。
  • 分代垃圾回收:Java的垃圾回收采用了分代回收策略。内存被分为新生代(Young Generation)和老年代(Old Generation)。新创建的对象通常会分配在新生代,而生命周期较长的对象则晋升到老年代。不同代使用不同的垃圾回收算法。
  • 新生代垃圾回收:新生代内存被划分为Eden空间和两个Survivor空间(通常称为S0和S1)。通常使用复制算法,在新生代之间来回复制存活的对象。经过多次回收后仍然存活的对象会被晋升到老年代。
  • 老年代垃圾回收:老年代内存通常存放着生命周期较长的对象。老年代的回收算法包括标记-整理(Mark and Compact)和标记-清除(Mark and Sweep)。
  • 并发和并行垃圾回收:一些JVM实现支持并发(Concurrent)垃圾回收和并行(Parallel)垃圾回收。并发垃圾回收允许在应用程序执行时进行部分垃圾回收,以减少停顿时间。并行垃圾回收使用多个线程并行执行垃圾回收操作,以提高回收效率。
  • G1垃圾回收器:Java 7引入了G1(Garbage-First)垃圾回收器,它是一种面向大堆、高吞吐量和低停顿时间的垃圾回收器。G1将内存划分为不同的区域,并优先回收包含垃圾最多的区域,从而最大限度地减少停顿时间。
  • 元空间:在Java 8及以后的版本中,永久代被移除,而是用元空间(Metaspace)来管理类的元数据和静态变量。元空间不再受到固定大小的限制,可以根据应用程序的需求动态调整。

1)分代垃圾回收机制

分代垃圾回收机制是一种内存管理策略,主要用于优化垃圾回收的效率。它的核心思想是将内存划分为不同的代(Generation),通常包括新生代(Young Generation)和老年代(Old Generation),以便更有效地管理不同生命周期的对象。

图片图片

以下是分代垃圾回收机制的原理:

  • 新生代(Young Generation):

新生代主要用于分配新创建的对象。由于大部分对象的生命周期很短,新生代采用了一种高效的垃圾回收算法,通常是复制算法(Copying Algorithm)。

新生代被分为三个部分:Eden空间和两个Survivor空间(通常称为S0和S1)。新创建的对象首先分配在Eden空间。

在垃圾回收过程中,首先会将Eden空间和一个Survivor空间中仍然存活的对象复制到另一个Survivor空间中,然后清除Eden和前一个Survivor空间中的所有对象。这样,每次垃圾回收后,存活的对象仍然保留在新生代。

  • 晋升与老年代(Promotion and Old Generation):
  • 在经过多次新生代的垃圾回收后,仍然存活的对象会被晋升到老年代。晋升的条件通常包括对象的年龄(在Survivor空间中的次数)和老年代的空间大小等。

  • 老年代主要用于存放生命周期较长的对象,因此老年代的垃圾回收策略通常使用标记-整理(Mark and Compact)或标记-清除(Mark and Sweep)算法。

  • 分代切换:

  • 分代垃圾回收通过合理地将对象在不同代之间进行切换,将不同生命周期的对象分配到适当的内存区域。

  • 新对象首先分配在新生代,然后通过多次垃圾回收判断其是否仍然存活。如果存活,它会被晋升到老年代,而不再频繁地在新生代进行垃圾回收。

分代垃圾回收机制的原理是根据对象的生命周期特点,将不同生命周期的对象放置在不同的内存区域,并使用不同的垃圾回收策略,从而提高了垃圾回收的效率和性能。这种机制在处理短寿命对象和长寿命对象的应用中具有优势。

2)G1 垃圾回收器

G1(Garbage-First)收集器是Java虚拟机(JVM)中的一种垃圾回收器,旨在提供更高吞吐量和更稳定的停顿时间。它于JDK 7引入,主要针对大内存堆和低停顿时间的应用场景。G1收集器通过将堆内存划分为多个区域(Region)来管理内存,并采用不同的垃圾回收策略来实现其目标。

以下是G1收集器的一些特点和工作原理:

  • 区域划分:G1 将堆内存划分为多个大小相等的区域,每个区域通常是1MB到32MB的大小。这些区域可以是 Eden 区、Survivor 区或老年区。
  • Mixed GC:G1 收集器使用 Mixed GC 策略,它综合了新生代和老年代的垃圾回收策略。在每次垃圾回收时,G1 会根据当前垃圾回收的需求来选择要回收的区域,优先选择包含垃圾最多的区域进行回收。
  • 并发标记:G1 采用并发标记算法,允许在应用程序执行时进行标记阶段。这有助于减少垃圾回收造成的停顿时间。标记阶段将标记所有存活的对象,以便在后续的垃圾回收阶段进行回收。
  • 整理阶段:G1 使用标记-整理(Mark and Compact)算法来进行垃圾回收,以减少碎片。在回收过程中,G1 会将存活对象移动到堆的一侧,然后清除未被移动的区域。
  • Region之间的引用:G1 会跟踪Region 之间的引用关系,以帮助确定存活对象的引用链。这有助于在回收时快速找到存活的对象。
  • 停顿时间目标:G1 的一个主要目标是控制垃圾回收造成的停顿时间。它会根据用户设置的停顿时间目标来调整垃圾回收的频率和区域的选择,以尽量减少长时间的停顿。

G1 收集器在大堆内存和低停顿时间的应用场景下表现出色。它通过区域划分、并发标记和 Mixed GC等策略,减少了垃圾回收带来的长时间停顿,同时提供了相对较高的吞吐量。根据应用程序的需求和性能目标,选择适当的垃圾回收器非常重要,G1 是一个在这方面具有竞争力的选择。

3)FullGC 机制

Full GC(Full Garbage Collection) 是指对整个堆内存(包括新生代和老年代)进行垃圾回收的操作,它的执行会导致应用程序的停顿时间较长。相对而言,Full GC 的停顿时间通常比部分垃圾回收(如新生代的垃圾回收)要长,因为它需要处理整个堆内存中的对象。

图片图片

Full GC 通常会在以下情况下发生:

  • 内存不足:当堆内存中的对象数量增加,达到了堆内存的容量上限,就会触发Full GC,以尝试释放更多的内存空间。
  • 长时间运行后:长时间运行的Java应用程序可能会导致老年代中的对象堆积,最终触发Full GC,以清理老年代中的垃圾对象。
  • 显式调用:开发人员可以通过Java代码中的System.gc()方法显式调用垃圾回收,其中可能会包括Full GC操作。

Full GC执行的过程通常包括以下步骤:

图片图片

  • 标记阶段:标记所有存活的对象,包括新生代和老年代中的对象。
  • 整理阶段:对老年代中的存活对象进行整理,以减少内存碎片。
  • 回收阶段:回收所有未被标记的对象,释放内存空间。

Full GC 的停顿时间较长,可能会对应用程序的性能和响应时间产生影响。因此,在设计和优化Java应用程序时,需要根据应用的需求和性能目标,合理配置堆内存大小、垃圾回收策略以及选择合适的垃圾回收器,以尽量减少Full GC的发生和影响。

责任编辑:武晓燕 来源: 大数据与云原生技术分享 JVMGC性能

(责任编辑:综合)

    推荐文章
    • 荣盛发展大股东质押公司7599万股股份 占公司总股本比例的1.75%

      荣盛发展大股东质押公司7599万股股份 占公司总股本比例的1.75%日前,荣盛发展发布公告称,其股东荣盛建设工程有限公司所持有的荣盛发展部分股份被质押,本次质押股份约为7599万股,占其所持股份比例的12.66%,占公司总股本比例的1.75%。对于筹集资金用途,荣盛建 ...[详细]
    • 消费金融3·15

      消费金融3·15一年一度的3•15消费者权益保护日又要来了。2020年11月,《中国人民银行金融消费者权益保护实施办法》以下称“金融消费者权益保护办法”)开始施行,监管部门对侵犯金融消费者合法权益的违法违规行为坚决依 ...[详细]
    • 开年银行第一紧:严控“经营贷”

      开年银行第一紧:严控“经营贷”春节假期后,银行经营贷严控政策还在持续升温中。提及开年银行工作会透露的信号,某股份制商业银行相关部门负责人告诉“愉见财经”:第一,2021年信贷规模整体并不算紧;第二,但在“调结构、调投向”领域中,目 ...[详细]
    • 三周期共振 长期看好电子产业 锚定两大方向

      三周期共振 长期看好电子产业 锚定两大方向“电子行业处在大周期起步阶段,需求、技术更新以及供应链市场份额提升,这三股推动力量都在上升之中。”广发聚瑞基金经理费逸认为,疫情只是外生性的一次性冲击,不会对具有深厚护城河企业 ...[详细]
    • 泰山石化(01192.HK)发布公告:预期2020年盈转亏

      泰山石化(01192.HK)发布公告:预期2020年盈转亏泰山石化(01192.HK)公告,相对于去年同期盈利,预期集团于截至2020年12月31日止年度将录得亏损。上述亏损并未计及7800万港元可换股债券及相关利息,尤其是该笔款项是否应予拨回或留存于公司其 ...[详细]
    • 流程再造与模式创新:中小商业银行发展普惠金融策略研究

      流程再造与模式创新:中小商业银行发展普惠金融策略研究摘要:步入新的发展历史阶段,落实新的发展理念,构建新的发展格局背景下中小商业银行发展面临新的战略选择。中小商业银行与普惠金融具有天然的依存关系,基于中小商业银行的本源与初心,普惠金融普惠性与商业银行商 ...[详细]
    • 国家发改委在京举行“诚信春运公众监督平台”上线启动仪式

      国家发改委在京举行“诚信春运公众监督平台”上线启动仪式1月12日,国家发展改革委在京举行了“诚信春运公众监督平台”上线启动仪式。该平台由国家发展改革委会同公安部、交通运输部、中国民用航空局、中国铁路总公司联合推出。今年首次将信用工 ...[详细]
    • 迈点早报

      迈点早报今日焦点据迈点不完全统计,2022年7月中国酒店市场共有35位高管履新,103家酒店开业,签约酒店数量达到96家。政策风向标西藏推出第三期“爽游西藏清凉一夏”本地游惠民消费券,共分批发放1000万元优 ...[详细]
    • 央行上海总部:10月人民币贷款增加357亿元 住户部门贷款增加202亿元

      央行上海总部:10月人民币贷款增加357亿元 住户部门贷款增加202亿元11月15日,央行上海官网发布2021年10月份上海货币信贷运行情况,数据显示,10月末,上海本外币贷款余额9.35万亿元,同比增长11.4%;人民币贷款余额8.57万亿元,同比增长11.2%,增速比 ...[详细]
    • 胡晓明二三事:银行老兵 中年改命

      胡晓明二三事:银行老兵 中年改命18岁进入体制,将近36岁才跳出来。起点一般,运气一般,过得波澜不惊,用了17年熬成了体制内一名不大不小的领导。胡晓明在这些年所取得的成就,是一个中年男子的进击,堪称逆天改命。3月12日晚,蚂蚁集团执 ...[详细]
    热点阅读