还在为学不会JVM&G1烦恼吗?看阿里P8源码分析笔记,你想要的都有

JVM 源码分析09 垃圾回收02 新生代DefNewGeneration的实现 内存初始化实现 分别通过EdenSpace和ContiguousSpace类实现新生代的eden和from to区域,(其中Contiguous是"连续"的意思,表示一块连续的内存空间),其中EdenSpace在实现上是继承自ContiguousSpace的。 1、如果_eden_space、_from_space、_to_sp... 阅读详情

写在前面

G1是目前最成熟的垃圾回收器,已经广泛应用在众多公司的生产环境中。我们知道,CMS作为使用最为广泛的垃圾回收器,也有令人头疼的问题,即如何对其众多的参数进行正确的设置。G1的目标就是替代CMS,所以在设计之初就希望降低程序员的负担,减少人工的介人。但这并不意味着我们完全不需要了解G1的原理和参数调优。

相信很多朋友们在实际工作中,遇到过一些因参数设置不正确而导致GC停顿时间过长的问题。但要正确设置参数并不容易,这里涉及两个方面:第一,需要对G1的原理熟悉,只有熟悉G1的原理才知道调优的方向;第二,能分析和解读G1运行的日志信息,根据日志信息找到G1运行过程中的异常信息,并推断哪些参数可以解决这些异常。

看到这里,是不是感觉G1学习起来很有难度?不用担心,在这里笔者为大家带来一篇阿里P8级大佬整理的JVM&G1源码解析和调优的秘籍,希望能够帮到大家~~~

主要内容

本篇尝试从G1的原理出发,系统地介绍新生代回收、混合回收、Full GC、并发标记、Refine 线程等内容;同时依托于jdk8u的源代码介绍Hotspot如何实现G1,通过对源代码的分析来了解G1提供了哪些参数、这些参数的具体意义;最后还设计了一些示例代码,给出了G1在运行这些示例代码时的日志,通过日志分析来尝试调整参数并达到性能优化,还分析了参数调整可能带来的负面影响。

  • G1中涉及的基本概念,如分区、卡表、根集合、线程栈等。
  • G1是如何分配对象的,包括TLAB和慢速分配,以及在实践中参数调优的经验。
  • G1 Refine线程原理和参数调优。
  • G1如何进行新生代回收,包括对象标记、复制、分区释放等详细过程。
  • G1的并发标记算法和步骤,以及对参数调优进行了综合分析。
  • G1的串行FGC和JDK 10之后的并行FGC算法。
  • G1和其他垃圾回收器的比较,以及下一代垃圾回收器:JDK 11中引入的ZGC和JDK 12中引入的Shenandoah。

第1章:垃圾回收概述

  • 1.1 Java发展概述
  • 1.2 本书常见术语
  • 1.3 回收算法概述
  • 1.4 JVM垃圾回收器概述

第1章介绍垃圾回收的发展及使用的算法,同时还介绍一些重要并常见的术语。该章的知识不仅仅限于本篇介绍的G1,对于研读JVM文章或者JVM源码都有帮助。


第2章:G1的基本概念

  • 2.1 分区
  • 2.2 G1停顿预测模型
  • 2.3 卡表和位图
  • 2.4 对象头
  • 2.5 内存分配和管理
  • 2.6 线程
  • 2.7 日志解读
  • 2.8 参数介绍和调优

第2章介绍G1中的基本概念,包括分区、卡表、根集合、线程栈等和垃圾回收相关的基本知识点。


第3章:G1的对象分配

  • 3.1 对象分配概述
  • 3.2 快速分配
  • 3.3 慢速分配
  • 3.4 G1 垃圾回收的时机
  • 3.5 参数介绍和调优

第3章介绍G1是如何分配对象的,包括TLAB和慢速分配,G1的对象分配和其他垃圾回收器的对象分配非常类似,只不过在分配的时候以分区为基础,除此之外没有额外的变化,所以该章知识不仅仅适用于G1也适用于其他垃圾回收器,最后介绍了参数调优,同样也适用于其他的垃圾回收器。


第4章:G1的Refine线程

  • 4.1 记忆集
  • 4.2 Refine 线程的功能及原理
  • 4.3 Refinement Zone
  • 4.4 RSet 涉及的写屏障
  • 4.5 日志解读
  • 4.6 参数介绍和调优

第4章介绍G1 Refine线程,包括G1如何管理和处理代际引用,从而加快垃圾回收速度,介绍了Refinement 调优涉及的参数;虽然CMS也有卡表处理代际引用,但是G1的处理和CMS并不相同,Refine 线程是G1新引入的部分。


第5章:新生代回收

  • 5.1 YGC算法概述
  • 5.2 YGC代码分析
  • 5.3 YGC 算法演示
  • 5.4 日志解读
  • 5.5参数介绍和调优

第5章介绍新生代回收,包括G1如何进行新生代回收,包括对象标记、复制、分区释放等细节,还介绍了新生代调优涉及的参数。


第6章:混合回收

  • 6.1 并发标记算法详解
  • 6.2 并发标记算法的难点
  • 6.3 G1中混合回收的步骤
  • 6.4 混合回收中并发标记处理的线程
  • 6.5 并****发标****记算法演示
  • 6.6 GC活动图
  • 6.7 日志解读
  • 6.8 参数优化

第6章介绍混合回收。主要介绍G1的并发标记算法及其难点,以及G1中如何解决这个难点,同时介绍了并发标记的步骤:并发标记、Remark (再标记)和清理阶段;最后还介绍了并发标记的调优参数。


第7章:Full GC

  • 7.1 Evac失败
  • 7.2 串行FGC
  • 7.3 并行FGC
  • 7.4 日志解读
  • 7.5 参数介绍和调优

第7章介绍FullGC。在G1中,FullGC对整个堆进行垃圾回收,该章介绍G1的串行FullGC和JDK10之后的并行FullGC算法。


第8章:G1中的引用处理

  • 8.1 引用概述
  • 8.2 可回收对象发现
  • 8.3 在GC时的处理发现列表
  • 8.4 重新激活可达的引用
  • 8.5 日志解读
  • 8.6 参数介绍和调优

第8章介绍垃圾回收过程中如何处理引用,该功能不是G1独有的,也适用于其他垃圾回收器。


第9章:G1的新特性——字符串去重

  • 9.1 字符串去重概述
  • 9.2 日志解读
  • 9.3 参数介绍和调优
  • 9.4 字符串去重和String.intern的区别
  • 9.5 String.intern中的实现

第9章介绍G1的新特性:字符串去重。根据OpenJDK的官方文档,该特性可平均节约内存13%左右,所以这是一个非常有用的特性,值得大家尝试和使用。另外,该特性和JDK中String类的intern方法有一些类似的地方, 所以该章还比较了它们之间的不同。


第10章:线程中的安全点

  • 10.1 安全点的基本概念
  • 10.2 G1 并发线程进入安全点
  • 10.3 解释线程进入安全点
  • 10.4 编译线程进入安全点
  • 10.5 正在执行本地代码的线程进入安全点
  • 10.6 安全点小结
  • 10.7 日志分析
  • 10.8 参数介绍和调优


    ]

第10章介绍线程中的安全点。安全点在实际调优中涉及的并不多,所以很多人并不是特别熟悉。实际上,垃圾回收发生时,在进入安全点中做了不少的工作,而这些工作基本上是串行进行的,这些事情很有可能导致垃圾回收的时间过长。该章除了介绍如何进入安全点之外,还介绍了在安全点中做的一些回收工作,以及当发现它们导致GC过长时该如何调优。


第11章:垃圾回收器的选择

  • 11.1 如何衡量垃圾回收器
  • 11.2 G1调优的方向

第11章介绍如何选择垃圾回收器,以及选择G1遇到问题需要调优时我们该如何下手。该章属于理论性的指导,在实际工作中需要根据本书提到的参数正面影响和负面影响综合考虑,并不断调整。


第12章:新一代垃圾回收器

  • 12.1 Shenandoah
  • 12.2 ZGC

第12章介绍了下一代垃圾回收器Shenandoah和ZGC。G1作为发挥重要作用的垃圾回收器仍有不足之处,因此未来的垃圾回收器仍会继续发展,该章介绍了下一代垃圾回收器Shenandoah和ZGC对G1的改进之处及其工作原理。


乍听起来,G1非常复杂,应该会有很多的参数。实际上在JDK8的G1实现中,一共新增了93个参数,其中开发参数(develop)有41个,产品参数( product)有31个,诊断参数( diagnostic)有9个,实验参数( experimental)有12个。开发参数需要在调试版本中才能进行验证(本篇只涉及个别参数),其余的三类参数都可以在发布版本中打开、验证和使用。

本篇除了几个用于验证的诊断参数外,覆盖了发布版本中涉及的所有参数,为大家理解G1以及调优G1提供了帮助。

STM32Cubemx+CanFestival:从零到一的CANopen移植实战 本文详细介绍了如何使用STM32CubeMX和CanFestival实现CANopen协议栈的移植,从开发环境搭建到核心配置步骤,再到调试与问题排查。通过实战经验分享,帮助开发者快速掌握STM32与CANopen的结合应用,提升嵌入式系统开发效率。 阅读详情

相关推荐

AFE芯片做什么用的?AFE(Analog Front End) 模拟前端

AFE采样精度的影响因素非常多,需要综合考虑各种因素,并根据实际应用场景来选择合适的参数和方法。通过减少噪声、提高采样频率、调节放大器增益、降低电源噪声、优化传输线路、进行温度补偿、选择合适的ADC分辨率、根据信号类型选择合适的AFE参数、进行器件匹配和校准等方法,可以提高AFE的采样精度,从而更好地满足各种应用需求。版权声明:本文为优快云博主「czf.Forver」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

学海无涯的专栏 4万+

JVM G1 源码分析(一)- 分区Heap Region

最小的region_size 为 1M,在jdk18中,放开了g1的regionsize的32m的限制,最大可以设置到512m,HR个数为2048个。计算HR size的逻辑主要在setup_heap_region_size函数中计算初始堆内存和最大堆内存的平均值average_heap_size,取HR size下限(1MB)和average_heap_size / 2048的最大值,赋值给region_size;HR的size必须是2的幂次,即仅可为1MB、2MB、4MB、8MB、16MB、32MB。

qq_16500963的博客 709

SAP ALV表格F4搜索帮助不触发DATA_CHANGE?3步排查搞定

本文针对SAP ALV表格中F4搜索帮助选择值后,DATA_CHANGE事件不触发的经典问题,提供了三步系统性排查方法。核心在于理解F4值回写机制,并需在事件处理中手动填充修改表以通知ALV控件数据变更,从而确保后续校验、自动计算等依赖DATA_CHANGE的逻辑能正常执行。

c2d3e4f的博客 1135

JVM G1源码分析(一)——卡表和位图

借助额外的数据结构描述这种引用关系,例如使用类似位图(bitmap)的方法,记录A和B的内存块之间的引用关系,用一个位来描述一个字,假设在32位机器上(一个字为32位),需要32KB(32KB×32=1M)的空间来描述一个分区。那么我们就可以在这个对象ObjA所在分区A里面添加一个额外的指针,这个指针指向另外一个分区B的位图,如果我们可以把对象ObjA和指针关系进行映射,那么当访问ObjA的时候,顺便访问这个额外的指针,从这个指针指向的位图就能找到被ObjA引用的分区B对应的内存块。

qq_16500963的博客 1134

Ubuntu Server 24.04 安装 (超详细)

本文介绍最小化安装 Ubuntu Server的详细过程。

炀炀的专栏 1万+

UM2 3D 打印机 DIY 实践 (2) 电路篇

涉及到的东西非常多,实际上后面还会讲到。主要部件清单: 主板 mega2560 + Ramps1.4 + LCD12864 各一张 42 x38mm x3,xyz 轴各一台 42 x23mm x1,用在挤出机 泰坦远程挤出机 x1 TMC2225 驱动板 x4, 替代a4988、TMC2208,静音效果好,性价比高 s-250-12v 20A开关电源 x1。功率必须足够大,宁可选大一点的 大功率 MOS 管,25A x1 NTC .

afeiqiang的专栏 3603

JVM G1源码分析——新生代回收

YGC算法主要分为两部分:并行部分和其他部分。我们根据YGC的执行顺序来看一下整个收集过程的主要步骤。1)进行收集之前需要STW。2)选择要收集的CSet,对于YGC来说整个新生代分区就是CSet。根扫描并处理;处理过程会把根直接引用的对象复制到新的Survivor区,然后把被引用对象的field入栈等待后续的复制处理。处理老生代分区到新生代分区的引用;

qq_16500963的博客 979

Qwen3-Omni-30B-A3B-Instruct微调指南:如何打造专属智能博物官(附数据集)

本文详细介绍了如何对Qwen3-Omni-30B-A3B-Instruct模型进行微调,以打造专业的智能博物官。指南涵盖了从理解模型架构优势、构建高质量文博数据集,到使用LLaMA-Factory进行实战微调、效果评估与部署优化的完整流程,并提供了关键的环境配置与性能优化建议,帮助开发者在垂直领域高效定制专属AI助手。

weixin_29096377的博客 1145

JVM G1 源码分析和调优(1)

JVM G1 源码分析和调优jvm常见术语 jvm常见术语 术语 描述 并行(parallelism) 指两个或多个事件在同一时刻发生,在现代计算机中通常指多台处理器上同时处理多个任务 并发(concurrency) 指两个或多个事件在同一时间间隔发生 ParNew 并发收集器 CMS 并发标记清除 JVM中的并行 指多个垃圾回收相关线程在操作系统之上并发运行,这里的并行强调的是只有立即回收线程工作,Java应用都暂停执行,因此parNew工作的时候一定发生STW JVM

1999的博客 583

ABAP Cloud 开发教程的文章目录

本教程涵盖 ABAP 云端 Client 处理、多租户架构、ABAP Cloud开发、动态编程优化、SQL语法改进等技术主题。最新版本1.0.0(更新至2025-12-12),包含197篇文章,重点文章包括《ABAP Client Handling与隔离机制》《ABAP Platform 2021泛型编程》《SAP BTP ABAP多租户应用开发》等,为开发者提供从基础到进阶的实战指南。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1821

关于Sybase ASE数据库的license以及试用版过期的问题的解决方案

当用户从Sybase官网上下载了ASE15.0.2以后,如果选择了安装Express Edition或者Developer Edition,基本上不会碰到什么问题,除了有些功能受限以下。 但大多数可能选择了Enterprise Edition for Evaluation类型,即企业版试用。都会碰到这样的问题,即一个月以后,license过期,无法启动server。于是很郁闷,可能大部分人,会选...

iihero@优快云 791

JVM G1 源码分析(三)- Remembered Sets

1. 简介 记录集Remembered Sets简称RSet,用于记录对象在不同分区之间的引用关系,目的是为了加速垃圾回收的速度,主要是加速标记阶段。 本文将详细介绍RSet的结构。 通常的,有两种记录引用关系的方式,PointOut和PointIn。 如果obj1.field1=obj2,如果是PointOut方式,则在obj1所在region的RSet记录obj2的位置;如果是PointIn方...

860MHz的专栏 3968

YOLOv11在STM32H7上的MCU部署实战:基于CMSIS-NN的高效推理实现

嵌入式AI与MCU部署技术解析 本文系统介绍了基于STM32H7微控制器的YOLOv11模型部署方案。主要内容包括: 边缘计算背景下MCU的AI部署优势与挑战,重点分析了STM32H7平台特性 YOLOv11模型的结构优化,包括E-ELAN骨干网络和Meta-ACON激活函数等改进 CMSIS-NN加速库的架构原理,在STM32H743上可实现5.4倍卷积加速 完整的开发环境搭建流程,涵盖硬件选型、工具链配置和模型转换 模型优化关键技术,包括int8量化、剪枝和内存占用优化等 实验表明,该方案在保持模型精度

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 855

JVM G1 源码分析(六)- 混合式GC

1. 简介 YGC整个过程都在STW下进行,出于减少停顿时间的考量,对于老年代的回收显然需要与Mutator同时进行,G1引入了混合式GC,与CMS算法类似,均采用了并发标记。 混合式回收主要分为如下子阶段: 初始标记子阶段 并发标记子阶段 再标记子阶段 清理子阶段 垃圾回收 2. 算法概览 2.1 标记算法概览 由于混合式GC使用的是并发标记,Mutator可能会随时改变对象引用关系,从而导...

860MHz的专栏 1955

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

深入理解JVM 一GC(下) G1 Garbage Collector

关于java程序性能当我们调优java程序时,通常的目标有两个: 响应能力 或者 吞吐量响应能力响应能力指一个程序或者系统对请求的是否能够及时响应。 比如: 一个桌面UI能多快的响应一个事件; 一个网站能够多快返回一个页面请求; 数据库能够多快返回查询的数据;对于这类对响应能力敏感的场景,长时间的停顿是无法接受的。吞吐量吞吐量关注的是,在一个指定的时间内,最大化一个应用的工作量。 如下方

张硕的博客 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

JVM G1源码分析和调优书 阅读笔记 一

G1 垃圾回收器 分区 Heap Region,下限是1MB,上限是32MB,默认整个堆空间分为2048个分区region 1.通过G1HeapRegionSize可以指定大小,默认值为0 2.不指定region大小,由G1启发式推断HR大小 ---- 根据堆空间最大值和最小值,以及HR的个数进行推断 如果G1 是启发式推断新生代的大小,扩张时如果有空闲的分区列表,就直接加入到新生代分区列表...

郭传志的博客 1257

JVM篇-结合源码分析垃圾收集器的类型

这一篇我们来看下JVM中的垃圾收集器,看下这些垃圾收集器是怎样选择以及初始化的一些信息。建议在看本篇文章的时候看下前面两篇 一、基本介绍 1、方法调用链 关于垃圾收集器选择初始化就是在initialized_heap()方法的create_heap()方法: CollectedHeap* Universe::_collectedHeap = NULL; jint Universe::initialize_heap() { jint status = JNI_ERR; _collectedHe

Feverasa的博客 843

OpenJDK源码赏析之七(JVM垃圾回收器概述)

在传统的C/C++开发中,程序员需要亲手对内存中的空间开辟和进行释放,当内存忘记回收就会爆栈,就算记得回收,但是指向给内存的指针没有释放,程序也会崩溃或者异常,其他问题更是数不胜数,堪称究极折磨了 以企业的角度看,C/C++程序员需要大量时间培养也很难写出安全的代码,企业更希望降低成本,希望来的程序员能立马上手干活,所以开始大量使用Java,降低企业的开发成本 以程序员的角度来说Java能让程序员避免和一些“未知敌人”搏斗(比如说Java直接屏蔽了指针,程序员很难写出不安全的代码),从而更好的释放生产力

星空_MAX 2285

JAVA垃圾回收器源码_JavaSE基础代码(3)--JavaSE程序入口,JDK,JRE,JVM垃圾回收器的关系与作用...

在前面的几章中我们一直在进行环境的搭建,然而并没有对代码进行讲解,那么从现在起,我们开始撕开Java程序神秘的外衣.来了解他.以便于完成我们想要实现的功能JavaSE程序入口:在生活中我们要做一个事情,那么总要找一个突破口,或者说进入口.那么程序也一样,从哪里开始执行也是有规定的JavaSE项目的程序入口就是我们见到的main方法,哒哒哒他来了,我们来康康他就是我们红色框中的方法,他的写法是固定的...

weixin_28943105的博客 308

JVM垃圾回收算法及垃圾回收器

JVM基本垃圾回收算法,按照基本回收策略分 标记-清除(Mark-Sweep) 一、标记-清除(Mark-Sweep) https://www.html.cn/qa/other/22924.html 此算法执行分两阶段。 第一阶段 标记:遍历内存区域,对需要回收的对象打上标记。 第二阶段 清除:再次遍历内存,对已经标记过的内存进行回收。 此算法需要暂停整个应用 绿色、蓝色---代表存活对象 灰色---非存活对象 白色--未使用的内存 缺点: 效率问题:遍历了两次内存空间(

喵酱 2961

详解JVM中的经典7种垃圾回收器(Garbage Collector)

@TOC 垃圾收集器分类与性能指标 概述 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。 由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。 从不同角度分析垃圾收集器,可以将GC分为不同的类型。 小技巧学Java不同版本新特性 语法层面:Lambda表达式、switch、自动拆箱装箱、enum、泛型等 API层面:Stream API、新的日期时间、Optional、String、集合框架 底层优化:JVM优化、GC的变化、元空间、静态域

不想打代码 4070

java 并行gc_初探JAVA 10之G1收集器并行Full GC

G1收集器时JAVA 9正式引入的。JAVA 10发布之后,对G1收集器的Full GC做了优化,优化点就是把单线程的Full GC变成了多线程并行Full GC。那我们怎么看出这个优化点呢?下面我们来做个实验。ObjectChurn上面的代码会往data数组里面写数据,重复十遍。我们先用JDK 9来看看程序GC情况如何。启动之前,我们加入JVM启动参数:-Xlog:gc,gc+cpu::upti...

weixin_34324618的博客 694

内存数据库SQLite

本文以“黑板”比喻内存数据库,对比传统硬盘数据库,详解 SQLite 使用 :memory: 实现高速临时存储的原理与优势。通过动态占位符生成、executemany 批量操作等技巧,实现毫秒级数据读写,适用于单元测试、临时计算与隐私保护场景。强调其瞬时性与内存限制,提醒开发者注意数据量控制与安全防护,突出参数化查询防注入的核心价值。

看了都说刑的博客 353

从零学 JVM(七):垃圾收集器详解——Serial、ParNew、Parallel、CMS 与 G1

垃圾收集器是JVM中实现垃圾回收算法的具体组件,负责执行内存回收。JDK 8常见收集器包括Serial、ParNew、Parallel Scavenge、CMS等,各有侧重:Serial单线程,适合小内存;ParNew多线程并行,常与CMS搭配;Parallel Scavenge注重吞吐量,支持自适应调节;CMS以低停顿为目标,采用并发标记-清除,但存在内存碎片和浮动垃圾问题。理解并行(多线程协同)与并发(与应用共行)的区别,有助于选择合适收集器。

2403_87560480的博客 212

从零学 JVM(一):什么是 JVM?JVM、JDK、JRE 有什么区别?

JVM(Java虚拟机)是执行Java字节码的运行环境,负责类加载、字节码执行与内存管理。Java通过javac编译为平台无关的字节码,由各平台的JVM解释或即时编译执行,实现“一次编译,到处运行”的跨平台特性。JVM并非跨平台,但其规范支持多种语言(如Kotlin、Scala)编译为字节码运行。JDK包含JRE,JRE包含JVM,三者构成完整的开发与运行体系。Java采用编译+解释+JIT优化的混合执行机制,兼顾启动速度与运行效率。

2403_87560480的博客 286

从零学 JVM(六):垃圾回收算法详解——标记清除、标记复制与标记整理

JVM 采用多种垃圾回收算法应对内存管理挑战。标记-清除算法实现简单但易产生碎片;标记-复制算法避免碎片,适合存活率低的新生代;标记-整理算法通过移动对象消除碎片,适用于高存活率的老年代。为提升效率,JVM 采用分代收集思想:新生代用复制算法(如 Eden 与 Survivor 配合),老年代用标记-整理或清除。不同收集器(如 Serial、G1)结合算法特点,平衡性能与内存利用率,实现高效垃圾回收。

2403_87560480的博客 255
上一篇: 阿里P8大佬,整理的从零构建企业级容器集群实战笔记,真涨薪神器
下一篇: 请求与响应参数日志记录框架
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值