.NET 面试必问的 8 道 GC 题,建议收藏

C#.NET面试核心:值类型、装箱拆箱与GC原理详解 在C#.NET开发中,理解值类型与引用类型的区别是掌握内存管理的基础。值类型直接存储数据于栈内存,包括数值类型和结构体,而引用类型在堆内存存储对象引用。装箱和拆箱操作涉及值类型与引用类型的转换,会带来显著的性能开销,特别是在循环和高频调用场景中。垃圾回收(GC)是.NET自动管理内存的核心机制,通过代际回收优化性能。这些概念直接影响代码效率,特别是在处理集合操作、异步编程和资源管理时。本文深入解析C#类型系统原理,结合装箱拆箱性能实测数据,帮助开发者编写更高效的.NET应用程序。 阅读详情

大家好,我是码农刚子。这篇文章整理了 .NET 面试中出现频率最高的 8 道 GC 题。不是背答案——是帮你把 GC 的底层逻辑串一遍,面试时不管怎么追问都能接得住。

01 .NET GC 的分代机制是怎么回事?

这是开胃菜,但答不好直接出局。

.NET GC 把托管堆分成三代:Gen 0、Gen 1、Gen 2。核心假设是——新对象死得快,老对象活得久。

新对象分配在 Gen 0。Gen 0 预算满了,触发 Gen 0 回收。活下来的晋升 Gen 1。Gen 1 预算满了,触发 Gen 1 回收(连带 Gen 0)。活下来的晋升 Gen 2。Gen 2 回收就是 Full GC,代价最大。

为什么这么设计?因为压缩整块堆太贵了。分代让你只频繁回收一小块(Gen 0),大部分垃圾在 Gen 0 就清掉了,不需要动整个堆。

面试加分句:Gen 0 回收通常 < 1ms,Gen 2 回收可能十几毫秒到上百毫秒——这就是为什么我们要避免 short-lived 对象意外晋升到 Gen 2。

02 GC 什么时候触发?

不是只有一个答案。触发条件有好几个:

① Gen 0 预算耗尽——最常见。新对象分配量超过 Gen 0 阈值,自动触发 Gen 0 回收。

② 显式调用——GC.Collect()。生产代码几乎不该手动调。如果你调了,面试官一定会问你为什么。

③ 系统内存压力——OS 层面内存吃紧,GC 会收到通知提前回收。

④ LOH 分配触发——大对象分配本身可能触发 GC(下一条细讲)。

注意:GC 是自动的、异步的、非确定性的。你不知道它什么时候来——这就是为什么 Dispose 模式存在。

03 LOH 是什么?为什么它是个坑?

LOH = Large Object Heap。大于 85,000 字节的对象直接进 LOH,跳过 Gen 0。

坑在哪?LOH 不压缩。

普通堆回收后会压缩(移动对象填补空隙),但 LOH 从 .NET Framework 时代就不压缩,怕移动大对象代价太高。结果就是碎片化——你分配释放了几个大数组,堆里全是空洞,总内存没超但下一个大对象放不进去,OOM 了。

.NET 4.5.1+ 可以手动压缩:GCSettings.LargeObjectHeapCompactionMode = CompactOnce; 然后 GC.Collect()。但这是应急手段,不是日常操作。

真正的解法是池化——用 ArrayPool<T> 租借大数组而不是每次 new。这是面试官想听到的。

⚠️ 实战提醒:注意 string 在 .NET Core 3.0+ 也可能进 LOH(因为 string 内部是 char[]),超 85K 字符的字符串就是 LOH 对象。

04 Server GC 和 Workstation GC 有什么区别?

这是高并发场景的必问题。

Workstation GC:一个 GC 线程,所有 CPU 核共享一个堆。适合客户端应用、低并发场景。

Server GC:每个 CPU 核一个 GC 线程,每个核一个独立的堆。回收时多线程并行,吞吐量高。适合服务端高并发。

.NET Core / .NET 5+ 默认根据运行环境自动选择:ASP.NET Core 默认 Server GC,控制台应用默认 Workstation GC。可以通过 runtimeconfig.json 或 csproj 配置覆盖。

面试加分句:Server GC 不是银弹——它用更多内存换更高吞吐。内存受限的容器环境(比如 256MB 的 pod)反而可能要切回 Workstation GC,否则 GC 线程开销本身就吃掉了不少内存。

05 Finalizer 和 IDisposable 有什么区别?

这两个不是同一个东西,但很多人混着用。

Finalizer(C# 里写 ~MyClass())是 GC 的兜底机制。对象被回收前,GC 会把它放进 freachable 队列,由专门的 finalizer 线程执行。问题是——有 finalizer 的对象至少经历两次 GC 才能被回收(第一次进队列,第二次才释放)。而且执行时机不确定,你不知道什么时候调。

IDisposable 是程序员主动清理。调 Dispose() 立刻释放资源,不用等 GC。

标准模式是两者结合:实现 IDisposable,在 Dispose(true) 里释放托管+非托管资源,在 finalizer 里调 Dispose(false) 只释放非托管资源。这样即使用户忘了调 Dispose,finalizer 还能兜底。

💡 关键判断:如果你只持有托管资源(比如一个 List),不需要 finalizer。Finalizer 只在持有非托管资源(文件句柄、原生内存、数据库连接)时才有意义。

06 什么是 SafeHandle?为什么用它替代 IntPtr?

如果你在 P/Invoke 调用原生 API,这题一定会问到。

老写法是用 IntPtr 持有原生句柄,在 finalizer 里手动调 CloseHandle。问题在于——GC 不知道 IntPtr 持有什么资源,回收时机完全凭运气。更狠的是,如果在 finalizer 里异步调 CloseHandle,进程域冲突(AppDomain unload / 进程退出)时可能直接 crash。

SafeHandle 是 .NET 2.0 引入的抽象类,继承自 CriticalFinalizerObject。它保证:

① finalizer 一定执行(即使进程非正常退出) ② finalizer 在所有用户代码 finalizer 之后执行(保证顺序) ③ 防止句柄被回收后被复用导致的安全漏洞(handle recycling attack)

面试时一句话总结:SafeHandle 把原生资源的生命周期交给了 GC 管理,同时保证了可靠性和安全性,替代了手写 IntPtr + finalizer 的脆弱模式。

07 Pinning 对 GC 有什么影响?

Pinning = 把对象钉在堆上不让 GC 移动。

场景:P/Invoke 传数组给原生代码,或者用 fixed 语句拿指针。GC 压缩堆时会跳过 pinned 对象,在堆里留一个"洞"。

影响:碎片化。短期 pinning(一次 P/Invoke 调用)问题不大,GC 能处理。怕的是长期 pinning——比如把对象钉在 Gen 0,GC 压缩 Gen 0 时发现一大块动不了,碎片就来了。

.NET 5+ 引入了 pinning budget——GC 在 Gen 0 预留一块专门给 pinned 对象的区域,减少对其他对象的影响。但如果你 pin 了一个 Gen 2 对象,那 GC 压缩 Gen 2 时依然得绕开它。

实战建议:尽量缩短 pinning 时间;大对象用 GCHandle.Alloc(obj, GCHandleType.Pinned) 时明确知道在干什么;避免在 hot path 里反复 pin 同一个对象。

08 怎么诊断 GC 问题?

这是实战题,答得出来说明你不止背书。

第一层:性能计数器——dotnet-counters 监控 GC 基础指标:Gen 0/1/2 回收频率、堆大小、分配速率。先看趋势。

第二层:事件追踪——dotnet-trace collect --providers Microsoft-DotNETCore-SampleProfiler 抓 GC 事件,看每次回收耗时、触发原因。

第三层:堆分析——dotnet-gcdump 生成堆快照,用 PerfView 分析对象分布。看什么对象多、什么对象大、谁在持有。

第四层:生产环境——用 dotnet-dump 在容器里抓全量 dump,拉回来用 dotnet-dump analyze 或 WinDbg 分析。

典型排查路径:Gen 2 回收频率高 → 看大对象/长生命周期对象 → 查 LOH 碎片 → 定位到某个缓存/集合无限增长 → 加上限或换弱引用。


GC 这 8 道题,核心就一条线: 分代 → 触发 → 大对象 → 并发模式 → 资源释放 → 安全抽象 → Pinning 碎片 → 诊断工具 把这条线串起来,面试官怎么追问都不怕。


收藏这篇,面试前过一遍。

不是为了背答案——是为了把 GC 的那条线在脑子里走一遍。

关注 CSharp精选营,每周二四 get 能直接抄的 C# 实战。

阅读原文:.NET 面试必问的 8 道 GC 题,建议收藏 - 码录集

从SAR信号到洪涝地图:基于Sentinel-1数据的水体快速提取实战 本文详细介绍了如何利用Sentinel-1 SAR数据快速提取水体信息并生成洪涝地图的实战方法。通过预处理五部曲和SDWI指数计算,结合具体案例展示了SAR技术在洪涝灾害应急监测中的高效性和准确性,为救援决策提供关键支持。 阅读详情

相关推荐

从OFED到rdma-core:手把手带你搞定Linux下RDMA开发环境的选型与搭建

本文详细介绍了在Linux系统下搭建RDMA开发环境的完整流程,涵盖OFED与rdma-core的选型对比及分步安装指南。针对高性能计算和分布式存储需求,解析RDMA技术栈的核心组件,提供环境验证与性能测试方法,帮助开发者快速构建稳定高效的开发环境。特别适合需要优化网络性能的工程师参考。

weixin_26905487的博客 225

10道C#.NET初级面试题解析与性能优化技巧

在.NET开发中,理解C#核心概念如值类型与引用类型的内存分配、GC机制及多线程编程原理至关重要。值类型直接存储在栈上,而引用类型则在堆中分配,频繁的装箱拆箱操作会导致显著的GC压力。通过StringBuilder预分配等优化策略,可大幅提升字符串处理性能。委托与事件需注意线程安全,正确的Dispose模式实现能有效管理资源释放。这些技术不仅影响代码效率,更关系到系统稳定性,是.NET工程师面试中的高频考点,也是实际项目优化的关键点。掌握这些基础原理,能帮助开发者编写更高效、健壮的C#代码。

weixin_30983353的博客 256

有限元中的对称魔法:用1/6模型算整个涡轮叶片(含MATLAB代码)

本文深入解析了有限元分析中针对循环对称结构的高效求解策略。通过利用涡轮叶片等结构的几何重复性,仅需对1/6基本扇区建模并施加循环对称条件,即可精确推演整体力学行为,大幅降低计算规模。文章从数学原理推导到MATLAB代码实现,提供了完整的实战指南,适用于旋转机械的静力、模态及谐响应分析。

fire9的博客 310

【CLR C#】面向面试的.Net的GC(垃圾回收)机制及其整体流程

在.NET程序开发中,为了将开发人员从繁琐的内存管理中解脱出来,将更多的精力花费在业务逻辑上,CLR提供了自动执行垃圾回收的机制来进行内存管理,开发人员甚至感觉不到这一过程的存在。.NET程序可以找出某个时间点上哪些已分配的内存空间没有被程序使用,并自动释放它们。自动找出并释放不再使用的内存空间机制,就称为垃圾回收机制。本文主要介绍dotnet中的GC(垃圾回收)机制及其整体流程。...

baidu_33146219的博客 2万+

深入了解torch框架

大国的游戏,政府支持到位,是未来;AI : Artificial Intelligence,旨在研究、开发能够模拟、延伸和扩展人类智能的理论、方法、技术及应用系统,是一种拥有自主学习和推理能力的技术。它模仿人类大脑某些功能,包括感知、学习、理解、决策和问题解决。AI本质​ NLP(说话,听)、CV(眼睛)、自动驾驶、机器人(肢体动作)、大模型三要素:数据、网络、算力① 神经网络:找到合适的数学公式;② 训练:用已有数据训练网络,目标是求最优解;③ 推理:用模型预测新样本;PyTorch,简称Torch

qq_74732076的博客 1136

谷歌账号国家或地区设置修改全攻略:条件、流程与避坑指南

谷歌账号的国家或地区设置与付款资料、账号历史行为及登录环境强绑定,修改时需满足特定条件。其原理在于地区作为索引键,关联内容库、货币结算和风控策略。正确切换可解决内容推荐错乱、付款失败等问题,适用于搬家、订阅区域限定服务等场景。操作前需在目标地区创建付款资料、清空余额并取消订阅,且一年仅能修改一次。本文详解从准备到验证的完整流程,并揭示官方文档未提及的实操陷阱,助你安全完成地区切换。

weixin_42521558的博客 2282

.Net面试经验总结

金九银十即将到来,求职套路多,但是网上很多都是Web前端、Java方面的面经,很少有,Net和C#相关的面经。一方面国内从事.Net的程序员和Java相比少很多,另一方面公司的岗位不多并且薪资也比Java低。当时.Net还是有许许多多有趣的地方,C#的语法跟Java很相似,并且很多知识是多语言通用的(比如数据库、数据结构和算法、设计模式等等)。...

baidu_33146219的博客 2万+

STM32----SPI+DMA高效读写外部Flash的配置与实战

本文详细介绍了STM32通过SPI+DMA高效读写外部Flash的配置与实战方法。针对大量数据传输场景,使用DMA技术可显著提升系统效率,释放CPU资源。文章包含完整的代码实现、常见问题调试技巧以及性能优化建议,帮助开发者快速掌握这一关键技术。

pea55的博客 1030

整理.net面试题(60道题)

委托和事件没有可比性,因为委托是类型,事件是对象,下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别。GC是.Net的垃圾收集器,可以进行内存资源的回收,程序员无需关心资源的回收,当一个对象没有任何引用的时候就可以被回收了。Server.Transfer 是服务器请求资源,服务器直接访问目标地址的 URL,把那个 URL 的响应 内容读取过来, 然后把这些内容再发给浏览器, 浏览器根本不知道服务器发送的内容是从哪 儿来的,所以它的地址栏中还是原来的地址。

weixin_43872328的博客 2158

深入解析SSD报错“READ FPDMA QUEUED”:从诊断到修复全流程

本文深入解析了SSD报错“READ FPDMA QUEUED”的含义、成因与全流程解决方案。该错误通常指示硬盘硬件或健康状态问题。文章详细介绍了如何通过系统日志定位错误、解读关键的S.M.A.R.T.健康报告(重点关注重分配扇区计数等指标),并逐步进行硬件排查(如更换SATA数据线)、软件修复与数据抢救,最终指导用户根据诊断结果做出维修或更换SSD的决策。

weixin_29233333的博客 398

YOLOv8改进 | 特殊场景检测篇 | 最新的多尺度特征提取DICAM(全网独家首发,增强水下图像的质量)

本文给大家带来的最新改进机制是多尺度特征提取和通道注意力机制DICAM,深度Inception和通道注意力模块(DICAM)主要用于用于增强水下图像的质量、对比度和色偏。所提出的DICAM模型考虑了水下图像的比例退化和不均匀色偏,从而提高图像的质量。通过在两个公开的水下图像增强数据集上的广泛实验,验证了提出的模型在全参考和无参考图像质量评估指标方面。欢迎大家订阅我的专栏一起学习YOLO,购买专栏读者联系读者入群获取进阶项目文件!

Snu77的博客 2216

.NET8极致性能优化GC

点击上方蓝字 江湖评谈设为星标前言GC的性能优化,在.NET Core1.0就有了。比如把GC调成服务器运作模式,另外一个就是工作站模式。这两种模式有什么区别呢?工作站模式直接点就是C/S模式,也就是为客户端应用程序设计的。它的特点是占用资源少,内存少,基于这两点也导致了吞吐量,扩展性,程序性能的相应的受到一定的影响。服务器模式是为大规模的服务设计的,比如高性能,高并发,集群,微服务等等。服务器模...

dotNET跨平台 848

《AI应用架构师:解锁AI智能体于经济学研究洞察经济趋势的关键密码》

当经济学家还在为“疫情后的消费复苏曲线”“ChatGPT对就业的长期影响”等非线性问题挠头时,AI应用架构师已经用AI智能体搭建了一个“数字经济沙盘”:里面有会砍价的消费者、会算成本的企业、会调政策的政府,每个智能体像真实角色一样思考决策,甚至能模拟出“政策出台3个月后失业率的微妙变化”。这篇文章将带你从架构师视角拆解:如何用AI智能体破解经济学研究的3大痛点(数据爆炸、非线性复杂、动态演化)?如何设计能“活起来”的经济智能体?如何用智能体模拟出能指导现实的经济趋势?

AI天才研究院 902

避开这15个面试雷区:.NET开发者进阶面试完全避坑指南

在竞争激烈的技术面试中,.NET开发者往往因为一些看似细微但致命的错误而与理想职位失之交臂。作为资深技术面试官,我将从面试官视角为你揭示.NET面试中常见的15个雷区,并提供针对性的解决方案和实战演练。本文专为中高级.NET开发者设计,帮助你构建完整的技术深度和面试策略体系。 ## 面试官视角:我们真正在考察什么 ### 技术深度自测清单 在准备面试前,请先完成以下技术深度自测: - [

gitblog_00816的博客 903

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C#面试必问:垃圾回收(GC)的底层原理与实战优化技巧

本文深入解析C#垃圾回收(GC)的底层原理与实战优化技巧,涵盖分代模型、GC算法、性能诊断工具及高级调优技术。针对C#面试中的GC八股文问题,提供实用解决方案,帮助开发者优化内存管理,提升应用性能。

weixin_29231221的博客 395

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

.NET高级面试指南专题八【 垃圾回收机制GC】

总体而言,.NET的垃圾回收机制是CLR(Common Language Runtime)的一部分,它通过自动追踪和释放不再使用的对象,确保.NET应用程序的内存使用是高效和可靠的。需要注意的是,垃圾回收的触发时机是由垃圾回收器实现决定的,具体情况可能会因编程语言、运行时环境和垃圾回收算法的不同而异。垃圾回收的触发条件一般与各代的内存使用情况相关。例如,新生代的触发条件可能是新生代的内存空间即将用完,中生代的触发条件可能是新生代的回收次数达到一定阈值,老生代的触发条件可能是老生代的内存空间即将用完。

一个专注于技术研究创新的程序员 2014

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C#面试必问:垃圾回收(GC)机制详解与实战避坑指南

本文深入解析C#垃圾回收(GC)机制,涵盖分代回收原理、GC触发条件与工作流程,以及高频面试问题如Finalize与Dispose模式的区别。通过实战案例和WinDbg内存分析,帮助开发者掌握GC优化技巧,避免常见内存泄漏问题,提升面试表现和实际开发效率。

weixin_29292535的博客 115

.NET的GC理解误区

.NET的GC理解误区最近面试了一些人,发现对.NET的GC(垃圾回收)的理解都存在错误。GC其实是相当复杂的系统,虽然95%的情况下我们并不需要考虑它,但仍有5%的情况我们不得不接触GC体系来解决问题。比如这个问题:void Func(){  A a = new A();  B b = new B();  a.RefToB = b;  b.RefT

Dev in Nightmare 2324

.NET GC 分代机制与实战面试指南

大于 85,000 字节的对象直接进 LOH,跳过 Gen 0。// 这个数组直接进 LOH,不经过 Gen 0分代 → 触发 → 大对象 → 并发模式 → 资源释放 → 安全抽象 → Pinning 碎片 → 诊断工具主题核心要点分代Gen 0 快,Gen 2 慢,避免 short-lived 对象晋升触发自动、异步、非确定性,别手动 GC.Collect()LOH> 85KB 不压缩,用 ArrayPool 池化Server GC多线程高吞吐,但吃内存。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 323

面试官问.Net对象赋值为null,就会被GC回收吗?

1.前言一个小伙伴的私信:面试的时候,面试官问一个对象把它赋值为null,就会被GC回收吗?很显然是不会的,为什么会出现这种情况?来看下这个问题。2.概述示例代码:internal class Program{ static void Main(string[] args){ Program pm = new Program(); Console.Write...

dotNET跨平台 340

C#面试必问:垃圾回收(GC)的10个实战避坑指南

本文深入探讨C#面试中必问的垃圾回收(GC)机制,提供10个实战避坑指南。从GC核心认知到高频内存泄漏场景剖析,再到非托管资源管理和集合优化,帮助开发者掌握GC性能优化技巧,避免常见陷阱,提升应用性能。

weixin_26795617的博客 102

2026 .NET 面试八股文:高频题 + 答案 + 原理(面试加分技巧)

2026年.NET生态持续升温,.NET 10正式普及、Native AOT成为企业选型核心、AI集成与云原生落地加速,面试考察重点也从基础语法转向「原理 + 实战 + 性能」三维考核。

云中小生 421

C#经典面试题100道

C#经典面试题100道摘要 本文整理了一套全面的C#/.NET技术面试题库,包含5大核心模块:基础语法、.NET框架、高级特性、Web开发和架构设计。题库涵盖值类型/引用类型、面向对象、委托事件、泛型、异常处理等基础知识点,深入CLR原理、内存管理、多线程等底层机制,并包含LINQ、设计模式、并发编程等高级主题。Web开发部分聚焦ASP.NET Core和数据库访问,架构部分涉及微服务、容器化和监控方案。每个问题配有详细代码示例和原理分析,如值类型引用类型对比、自定义类型转换器实现等,适合中高级开发者系统复

xwb1040885790的博客 536

.NET常见面试题

面试题 1 什么是 CTS、CLS 和CLR 公共语言运行库(CLR)是一个CLI 的一个实现,包含了.NET 运行引擎和符合 CLI 的类库。 通用类型系统(CTS)包含在微软公司提交的 CLI 规范,定义了一个可以在 CLR 上运行的类型规范。 公共语言规范是 CTS的一个子集,定义了所有面向.NET 的程序所需要符合的最小规范集。 面试题 2 CLR 技术和 COM技术的比较 CLR ...

XR1986687846的博客 7227

2026 .NET 面试八股文:高频题 + 答案 + 原理(基础核心篇)

2026年.NET面试重点转向原理、实战与性能考察。基础篇核心考点包括:string与StringBuilder的区别(前者不可变产生GC负担,后者可变适合循环拼接);ref和out关键字(都实现引用传递,但out强制方法内赋值);值类型与引用类型的区别(存储位置、赋值方式及典型类型)。特别提示:string虽是引用类型但具有不可变性,struct值类型若含引用字段仍会涉及堆分配。面试需理解底层原理而非死记硬背。

云中小生 997

.net面试题(精选60题)

任何集合类都实现了IEnumerable接口,所以任何集合类对象都有一个GetEnumerator()方法,该方法可以返回一个实现了 IEnumerator接口的对象,这个返回的IEnumerator对象既不是集合类对象,也不是集合的元素类对象,它是一个独立的类对象。Server.Transfer 是服务器请求资源,服务器直接访问目标地址的 URL,把那个 URL 的响应 内容读取过来, 然后把这些内容再发给浏览器, 浏览器根本不知道服务器发送的内容是从哪 儿来的,所以它的地址栏中还是原来的地址。

微微的猪食小窝 808
上一篇: 我用 ASP.NET Core 做了个水稻病虫害检查系统
下一篇: IIS 后面挂 Kestrel,这 3 个配置错了就 502
码农刚子.
博客等级 码龄8年 554粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农刚子.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值