Shenandoah垃圾回收器:低延迟与高吞吐量之道

💡亲爱的技术伙伴们:

你是否正被这些问题困扰——

  • ✔️ 投递无数简历却鲜有回音?
  • ✔️ 技术实力过硬却屡次折戟终面?
  • ✔️ 向往大厂却摸不透考核标准?

我打磨的《 Java高级开发岗面试急救包》正式上线!

  • ✨ 学完后可以直接立即以此经验找到更好的工作
  • ✨ 从全方面地掌握高级开发面试遇到的各种疑难问题
  • ✨ 能写出有竞争力的简历,通过模拟面试提升面试者的面试水平
  • ✨ 对自己的知识盲点进行一次系统扫盲

🎯 特别适合:

  • 📙急需跳槽的在校生、毕业生、Java初学者、Java初级开发、Java中级开发、Java高级开发
  • 📙非科班转行需要建立面试自信的开发者
  • 📙想系统性梳理知识体系的职场新人

课程链接:https://edu.youkuaiyun.com/course/detail/40731课程介绍如下:

Java程序员廖志伟Java程序员廖志伟

优快云Java程序员廖志伟

📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)(进阶篇)、(架构篇)、《解密程序员的思维密码——沟通、演讲、思考的实践》作者、清华大学出版社签约作家、Java领域优质创作者、优快云博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。

Java程序员廖志伟

🍊 JVM核心知识点之Shenandoah:概述

在当今大数据和云计算时代,Java虚拟机(JVM)的性能直接影响着应用系统的稳定性和效率。特别是在长时间运行的服务中,内存泄漏和垃圾回收(GC)问题常常成为性能瓶颈。为了解决这一问题,Shenandoah垃圾回收器应运而生。Shenandoah是JVM的一种新型垃圾回收器,旨在提供低延迟和高吞吐量的垃圾回收性能。

Shenandoah之所以受到关注,是因为它能够显著降低GC的暂停时间,这对于需要高响应性的应用系统尤为重要。在传统的垃圾回收器中,如G1和CMS,虽然已经对降低暂停时间做了很多优化,但在某些场景下,GC的暂停时间仍然可能成为性能瓶颈。Shenandoah通过其独特的算法和设计,进一步缩短了GC的暂停时间,从而提高了系统的整体性能。

接下来,我们将深入探讨Shenandoah的背景介绍、设计目标和优势分析。首先,我们将介绍Shenandoah的背景,包括其诞生的原因和它在JVM发展历程中的地位。随后,我们将详细阐述Shenandoah的设计目标,即如何通过技术创新来优化垃圾回收过程。最后,我们将分析Shenandoah的优势,包括其如何实现低延迟和高吞吐量,以及它对现代应用系统性能提升的贡献。

通过本系列内容的介绍,读者将能够全面了解Shenandoah垃圾回收器的原理和优势,这对于优化Java应用系统的性能具有重要意义。在后续的讨论中,我们将逐步揭示Shenandoah如何通过其独特的算法和设计,实现垃圾回收的优化,以及这些优化如何在实际应用中发挥作用。

Shenandoah垃圾回收算法

Shenandoah垃圾回收算法是Oracle公司于2018年推出的一种新的垃圾回收技术,旨在解决JVM内存模型中的一些问题,提高垃圾回收的效率。Shenandoah算法是一种并发垃圾回收算法,它可以在应用程序运行时进行垃圾回收,从而减少应用程序的停顿时间。

JVM内存模型

JVM内存模型是Java虚拟机(JVM)的核心组成部分,它定义了JVM中内存的布局和访问方式。JVM内存模型主要包括以下几个部分:

  1. 堆(Heap):堆是JVM中最大的内存区域,用于存放几乎所有的Java对象实例以及数组。
  2. 方法区(Method Area):方法区用于存放已经被虚拟机加载的类信息、常量、静态变量等数据。
  3. 栈(Stack):栈是线程私有的内存区域,用于存放线程的局部变量和方法调用。
  4. 程序计数器(Program Counter Register):程序计数器是每个线程都有一个程序计数器,它用于指示下一条要执行的指令。
  5. 本地方法栈(Native Method Stack):本地方法栈用于存放本地方法(如C/C++方法)的调用信息。

Shenandoah与G1对比

Shenandoah和G1都是JVM中的并发垃圾回收算法,但它们在实现和性能上有所不同。

  1. 实现方式:Shenandoah采用了一种基于分区的垃圾回收策略,将堆内存划分为多个区域,并对这些区域进行并发回收。而G1采用了一种基于区域的垃圾回收策略,将堆内存划分为多个区域,并对这些区域进行并发回收。
  2. 性能:Shenandoah在处理小堆内存时性能优于G1,但在处理大堆内存时,G1的性能更佳。
  3. 适用场景:Shenandoah适用于对停顿时间要求较高的场景,如Web服务器、数据库服务器等。而G1适用于对内存使用和停顿时间都有要求的场景。

Shenandoah适用场景

Shenandoah适用于以下场景:

  1. 对停顿时间要求较高的场景:如Web服务器、数据库服务器等。
  2. 小堆内存场景:Shenandoah在处理小堆内存时性能优于G1。
  3. 多核处理器:Shenandoah能够充分利用多核处理器的优势,提高垃圾回收效率。

Shenandoah性能调优

  1. 调整堆内存大小:根据应用程序的需求,调整堆内存大小,以获得更好的性能。
  2. 调整并发垃圾回收线程数:根据CPU核心数调整并发垃圾回收线程数,以充分利用多核处理器的优势。
  3. 调整垃圾回收策略:根据应用程序的特点,选择合适的垃圾回收策略。

Shenandoah部署与配置

  1. 部署:将Shenandoah算法集成到JVM中,可以通过JVM启动参数来启用Shenandoah算法。
  2. 配置:通过JVM启动参数来配置Shenandoah算法的相关参数,如堆内存大小、并发垃圾回收线程数等。

Shenandoah社区与支持

Shenandoah算法的社区和官方支持如下:

  1. 社区:Shenandoah算法的社区活跃,可以访问Oracle官方网站获取相关信息。
  2. 官方支持:Oracle官方提供了Shenandoah算法的文档和示例代码,方便用户学习和使用。
对比项 Shenandoah垃圾回收算法 G1垃圾回收算法
实现方式 基于分区的垃圾回收策略,将堆内存划分为多个区域,并对这些区域进行并发回收 基于区域的垃圾回收策略,将堆内存划分为多个区域,并对这些区域进行并发回收
性能 处理小堆内存时性能优于G1,但在处理大堆内存时,G1的性能更佳 处理大堆内存时性能更佳,适用于对内存使用和停顿时间都有要求的场景
适用场景 对停顿时间要求较高的场景,如Web服务器、数据库服务器等;小堆内存场景;多核处理器 对内存使用和停顿时间都有要求的场景
停顿时间 减少应用程序的停顿时间,提高垃圾回收效率 通过并发回收减少停顿时间
并发性 并发垃圾回收算法,可以在应用程序运行时进行垃圾回收 并发垃圾回收算法,可以在应用程序运行时进行垃圾回收
性能调优 调整堆内存大小、并发垃圾回收线程数、垃圾回收策略 调整堆内存大小、并发垃圾回收线程数、垃圾回收策略
部署与配置 通过JVM启动参数来启用Shenandoah算法,配置相关参数 通过JVM启动参数来启用G1算法,配置相关参数
社区与支持 社区活跃,Oracle官方网站提供相关信息;官方提供文档和示例代码 社区活跃,Oracle官方网站提供相关信息;官方提供文档和示例代码

Shenandoah垃圾回收算法与G1算法在实现方式上相似,都采用区域划分的策略,但Shenandoah在处理小堆内存时表现更佳,而G1在处理大堆内存时更具优势。在实际应用中,Shenandoah更适合对停顿时间要求较高的场景,如Web服务器和数据库服务器,而G1则更适用于对内存使用和停顿时间都有要求的场景。两者都支持并发垃圾回收,并可通过调整JVM启动参数进行性能调优。尽管两者在社区支持和官方文档方面表现相似,但Shenandoah在社区活跃度上略胜一筹。

Shenandoah设计目标

Shenandoah是Java虚拟机(JVM)中的一种新型垃圾回收器,其设计目标旨在解决传统垃圾回收器在多核处理器上的性能瓶颈,提供更高效、更稳定的内存管理。以下是Shenandoah设计目标的详细阐述:

  1. 多核处理器优化:Shenandoah针对多核处理器进行优化,通过将垃圾回收任务分散到多个处理器核心上,减少单个核心的负载,提高整体性能。

  2. 低延迟:Shenandoah追求低延迟的垃圾回收,通过减少垃圾回收过程中的停顿时间,提高应用程序的响应速度。

  3. 高吞吐量:Shenandoah在保证低延迟的同时,追求高吞吐量,以满足大规模应用程序的需求。

  4. 并发控制:Shenandoah采用并发控制机制,在垃圾回收过程中尽量减少对应用程序的干扰,提高应用程序的稳定性。

  5. 内存管理策略:Shenandoah采用多种内存管理策略,如自适应内存分配、动态垃圾回收等,以适应不同场景下的内存需求。

  6. 资源分配策略:Shenandoah根据应用程序的运行状态,动态调整资源分配策略,以优化性能。

  7. 与JVM其他组件的兼容性:Shenandoah与其他JVM组件具有良好的兼容性,如类加载器、字节码执行引擎等。

  8. 与现有垃圾回收器的比较:Shenandoah在性能、延迟、吞吐量等方面与现有垃圾回收器(如G1、CMS等)进行比较,具有明显优势。

  9. 适用场景分析:Shenandoah适用于对性能要求较高、对延迟敏感的场景,如Web服务器、大数据处理等。

  10. 性能测试结果:Shenandoah在多个性能测试中表现出色,如低延迟、高吞吐量等。

  11. 社区反馈与改进方向:Shenandoah在社区中获得了良好的反馈,未来将针对以下方向进行改进:

    • 进一步降低延迟:通过优化算法和并发控制机制,降低垃圾回收过程中的停顿时间。

    • 提高吞吐量:针对不同场景,调整资源分配策略,提高吞吐量。

    • 增强兼容性:与其他JVM组件进行更深入的兼容性测试,确保Shenandoah在各种场景下都能稳定运行。

    • 优化内存管理策略:根据应用程序的运行状态,动态调整内存管理策略,提高性能。

总之,Shenandoah作为JVM中的一种新型垃圾回收器,其设计目标旨在解决传统垃圾回收器在多核处理器上的性能瓶颈,提供更高效、更稳定的内存管理。通过不断优化和改进,Shenandoah有望成为未来JVM中主流的垃圾回收器之一。

设计目标 描述
多核处理器优化 将垃圾回收任务分散到多个处理器核心上,减少单个核心的负载,提高整体性能。
低延迟 通过减少垃圾回收过程中的停顿时间,提高应用程序的响应速度。
高吞吐量 在保证低延迟的同时,追求高吞吐量,以满足大规模应用程序的需求。
并发控制 采用并发控制机制,在垃圾回收过程中尽量减少对应用程序的干扰,提高应用程序的稳定性。
内存管理策略 采用多种内存管理策略,如自适应内存分配、动态垃圾回收等,以适应不同场景下的内存需求。
资源分配策略 根据应用程序的运行状态,动态调整资源分配策略,以优化性能。
与JVM其他组件的兼容性 与类加载器、字节码执行引擎等JVM组件具有良好的兼容性。
与现有垃圾回收器的比较 在性能、延迟、吞吐量等方面与现有垃圾回收器(如G1、CMS等)进行比较,具有明显优势。
适用场景分析 适用于对性能要求较高、对延迟敏感的场景,如Web服务器、大数据处理等。
性能测试结果 在多个性能测试中表现出色,如低延迟、高吞吐量等。
社区反馈与改进方向 在社区中获得了良好的反馈,未来将针对进一步降低延迟、提高吞吐量、增强兼容性、优化内存管理策略等方面进行改进。

多核处理器优化策略不仅提升了垃圾回收的效率,还显著降低了单个核心的负载,从而在多任务处理环境中展现出卓越的性能。这种设计思路为现代计算机体系结构提供了新的视角,使得系统资源得到更加合理的分配和利用。

Shenandoah垃圾回收器,作为JVM(Java虚拟机)中的一种新型垃圾回收器,自推出以来,以其独特的优势特点,在性能表现、适用场景等方面展现出卓越的表现。以下是关于Shenandoah垃圾回收器的详细分析。

首先,Shenandoah垃圾回收器具有以下优势特点:

  1. 低延迟:Shenandoah垃圾回收器采用了一种名为“并发标记清除”的算法,能够在应用程序运行的同时进行垃圾回收,从而降低延迟,提高应用程序的响应速度。

  2. 高吞吐量:Shenandoah垃圾回收器在保证低延迟的同时,还能提供较高的吞吐量,满足大规模应用程序的需求。

  3. 自适应:Shenandoah垃圾回收器能够根据应用程序的运行情况自动调整垃圾回收策略,以适应不同的场景。

  4. 易于调优:Shenandoah垃圾回收器提供了丰富的参数,方便用户根据实际需求进行调优。

在性能表现方面,Shenandoah垃圾回收器具有以下特点:

  1. 低延迟:在低延迟场景下,Shenandoah垃圾回收器表现出色,能够有效降低应用程序的响应时间。

  2. 高吞吐量:在高吞吐量场景下,Shenandoah垃圾回收器同样表现出色,能够满足大规模应用程序的需求。

  3. 稳定性:Shenandoah垃圾回收器在长时间运行过程中,表现出较高的稳定性,降低了应用程序的故障率。

Shenandoah垃圾回收器适用于以下场景:

  1. 低延迟场景:如Web服务器、在线交易系统等,对响应速度要求较高的场景。

  2. 高吞吐量场景:如大数据处理、云计算等,对吞吐量要求较高的场景。

  3. 混合场景:在低延迟和高吞吐量需求并存的情况下,Shenandoah垃圾回收器同样适用。

与其他垃圾回收器相比,Shenandoah垃圾回收器具有以下优势:

  1. 低延迟:相较于其他垃圾回收器,Shenandoah垃圾回收器在低延迟场景下表现更为出色。

  2. 高吞吐量:在保证低延迟的同时,Shenandoah垃圾回收器还能提供较高的吞吐量。

  3. 自适应:Shenandoah垃圾回收器能够根据应用程序的运行情况自动调整垃圾回收策略,适应不同的场景。

在调优策略方面,以下是一些针对Shenandoah垃圾回收器的调优建议:

  1. 调整垃圾回收器参数:根据实际需求,调整Shenandoah垃圾回收器的相关参数,如堆大小、垃圾回收策略等。

  2. 监控垃圾回收性能:定期监控垃圾回收性能,及时发现并解决问题。

  3. 优化应用程序代码:优化应用程序代码,减少内存泄漏和垃圾回收压力。

Shenandoah垃圾回收器与JVM版本兼容性良好,目前支持以下JVM版本:

  1. OpenJDK 8u20+
  2. Oracle JDK 8u20+
  3. Red Hat JDK 8u20+
  4. Azul Zing 8u20+

在社区支持与更新情况方面,Shenandoah垃圾回收器得到了广泛的支持。OpenJDK社区持续对其进行优化和更新,为用户提供了良好的使用体验。

特点/方面 Shenandoah垃圾回收器 其他垃圾回收器
优势特点
低延迟 采用并发标记清除算法,降低延迟,提高响应速度 通常需要暂停应用程序进行垃圾回收,导致延迟
高吞吐量 保证低延迟的同时,提供高吞吐量 可能会牺牲吞吐量以降低延迟
自适应 根据应用程序运行情况自动调整垃圾回收策略 通常需要手动调整参数以适应不同场景
易于调优 提供丰富的参数供用户根据需求进行调优 可能需要更多专业知识来调整参数
性能表现
低延迟 在低延迟场景下表现出色 可能无法在低延迟场景下提供最佳性能
高吞吐量 在高吞吐量场景下表现出色 可能无法在高吞吐量场景下提供最佳性能
稳定性 长时间运行过程中表现出较高稳定性 可能存在稳定性问题,导致应用程序故障
适用场景
低延迟场景 Web服务器、在线交易系统等 需要平衡延迟和吞吐量的场景
高吞吐量场景 大数据处理、云计算等 需要平衡延迟和吞吐量的场景
混合场景 低延迟和高吞吐量需求并存的情况下 需要平衡延迟和吞吐量的场景
与其他垃圾回收器相比的优势
低延迟 表现优于其他垃圾回收器 可能存在延迟问题
高吞吐量 表现优于其他垃圾回收器 可能存在吞吐量问题
自适应 能够自动调整策略,适应不同场景 需要手动调整策略
调优策略
调整垃圾回收器参数 根据实际需求调整参数 根据实际需求调整参数
监控垃圾回收性能 定期监控性能,发现问题 定期监控性能,发现问题
优化应用程序代码 优化代码,减少内存泄漏和垃圾回收压力 优化代码,减少内存泄漏和垃圾回收压力
JVM版本兼容性
OpenJDK 8u20+
Oracle JDK 8u20+
Red Hat JDK 8u20+
Azul Zing 8u20+
社区支持与更新情况
OpenJDK社区持续优化和更新 可能缺乏社区支持,更新速度较慢

Shenandoah垃圾回收器在处理低延迟场景时,其并发标记清除算法能够有效减少应用程序的暂停时间,从而在Web服务器和在线交易系统中提供更流畅的用户体验。与其他垃圾回收器相比,Shenandoah在保证低延迟的同时,还能提供较高的吞吐量,这对于需要同时处理大量请求的应用程序来说尤为重要。此外,其自适应能力使得它能够根据应用程序的运行情况自动调整垃圾回收策略,减少了手动调优的复杂性和工作量。

🍊 JVM核心知识点之Shenandoah:工作原理

在当今大数据和云计算时代,JVM(Java虚拟机)作为Java应用的核心运行环境,其性能直接影响着应用的响应速度和稳定性。Shenandoah作为JVM的一种垃圾回收(GC)策略,因其高效的并发控制和内存管理能力,在处理大规模数据时展现出显著优势。以下将深入探讨Shenandoah的工作原理,并对其垃圾回收机制、内存管理和并发控制进行概述。

在大型分布式系统中,随着数据量的激增,JVM的内存管理变得尤为重要。Shenandoah的出现正是为了解决这一问题。它通过将垃圾回收与应用程序的执行周期紧密集成,实现了低延迟和高吞吐量的垃圾回收。具体来说,Shenandoah通过以下方式实现其高效性:

首先,Shenandoah采用了一种名为“并发标记清除”的垃圾回收机制。这种机制允许垃圾回收线程与应用程序线程并发执行,从而减少应用程序的停顿时间。其次,Shenandoah的内存管理策略旨在优化内存分配和回收,减少内存碎片,提高内存利用率。最后,Shenandoah的并发控制机制确保了垃圾回收线程在执行过程中不会对应用程序线程造成过多干扰,从而保证了系统的稳定性和响应速度。

接下来,我们将详细介绍Shenandoah的垃圾回收机制。Shenandoah通过将垃圾回收过程细分为多个阶段,如并发标记、并发清除和并发重分配等,实现了高效的垃圾回收。在并发标记阶段,Shenandoah会遍历所有活跃对象,标记出可达对象;在并发清除阶段,Shenandoah会清除未被标记的对象;在并发重分配阶段,Shenandoah会对内存进行整理,释放空间。

在内存管理方面,Shenandoah通过动态调整内存区域大小和优化内存分配策略,实现了高效的内存使用。此外,Shenandoah还支持多种内存分配器,如TLAB(Thread-Local Allocation Buffer)和CDS(Compressed Class-Data Sharing),以适应不同场景下的内存需求。

最后,Shenandoah的并发控制机制是其高效性的关键。通过使用锁和条件变量等同步机制,Shenandoah确保了垃圾回收线程在执行过程中不会对应用程序线程造成过多干扰。这种机制使得Shenandoah在处理大规模数据时,仍能保持低延迟和高吞吐量。

总之,Shenandoah作为JVM的一种高效垃圾回收策略,在处理大规模数据时展现出显著优势。通过深入了解其工作原理,我们可以更好地利用Shenandoah优化Java应用的性能。在接下来的内容中,我们将对Shenandoah的垃圾回收机制、内存管理和并发控制进行详细探讨,帮助读者全面了解这一JVM核心知识点。

Shenandoah垃圾回收算法

Shenandoah是Java虚拟机(JVM)中的一种垃圾回收(GC)算法,旨在提供低延迟和高吞吐量的垃圾回收性能。它通过将垃圾回收过程分解为多个阶段,并在不同的线程上并行执行,从而实现高效的垃圾回收。

Shenandoah工作原理

Shenandoah的工作原理可以概括为以下几个关键步骤:

  1. 标记阶段:Shenandoah使用并发标记算法来识别所有可达对象。在这个过程中,它会暂停应用程序的执行,但时间非常短暂。

  2. 清理阶段:在标记阶段完成后,Shenandoah开始清理阶段。这个阶段会并发地执行,以减少对应用程序的影响。

  3. 重分配阶段:在清理阶段完成后,Shenandoah会进行重分配阶段。这个阶段会调整内存布局,以优化内存使用。

Shenandoah与G1对比

与G1垃圾回收算法相比,Shenandoah具有以下特点:

  1. 低延迟:Shenandoah在保持低延迟方面表现更出色,因为它将垃圾回收过程分解为多个阶段,并在不同的线程上并行执行。

  2. 高吞吐量:Shenandoah在保持高吞吐量方面也具有优势,因为它可以更好地适应不同的工作负载。

  3. 内存布局:Shenandoah使用了一种称为“Region-based”的内存布局,这有助于提高垃圾回收效率。

Shenandoah适用场景

Shenandoah适用于以下场景:

  1. 低延迟应用:例如,Web服务器、数据库服务器等。

  2. 高吞吐量应用:例如,大数据处理、高性能计算等。

  3. 混合型应用:既需要低延迟,又需要高吞吐量的应用。

Shenandoah调优策略

为了充分发挥Shenandoah的性能,以下是一些调优策略:

  1. 调整堆大小:根据应用程序的需求,调整堆大小以优化内存使用。

  2. 调整并发级别:根据CPU核心数和应用程序的并发需求,调整并发级别。

  3. 调整内存布局:根据应用程序的特点,调整内存布局以优化垃圾回收效率。

Shenandoah性能表现

Shenandoah在性能方面表现出色,尤其是在低延迟和高吞吐量方面。以下是一些性能指标:

  1. 低延迟:Shenandoah的平均延迟时间低于G1。

  2. 高吞吐量:Shenandoah的平均吞吐量高于G1。

  3. 内存使用:Shenandoah在内存使用方面表现出色,因为它可以更好地适应不同的工作负载。

Shenandoah资源消耗

Shenandoah的资源消耗相对较低,因为它在垃圾回收过程中使用了并行和并发技术。以下是一些资源消耗指标:

  1. CPU资源:Shenandoah在垃圾回收过程中消耗的CPU资源相对较低。

  2. 内存资源:Shenandoah在垃圾回收过程中消耗的内存资源相对较低。

Shenandoah部署与配置

Shenandoah可以通过以下步骤进行部署和配置:

  1. 下载Shenandoah源代码:从OpenJDK官方网站下载Shenandoah源代码。

  2. 编译Shenandoah:使用OpenJDK提供的编译工具编译Shenandoah源代码。

  3. 配置JVM参数:在启动JVM时,配置Shenandoah相关的参数,例如堆大小、并发级别等。

通过以上步骤,您可以将Shenandoah集成到您的Java应用程序中,并享受其带来的性能优势。

比较项目 Shenandoah垃圾回收算法 G1垃圾回收算法
工作原理 将垃圾回收过程分解为多个阶段,并在不同的线程上并行执行 将堆内存划分为多个区域,通过并发和独占的垃圾回收过程来回收垃圾
标记阶段 使用并发标记算法识别可达对象,暂停时间短暂 使用并发标记和独占的标记-清除过程
清理阶段 并发执行,减少对应用程序的影响
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值