讲师中心 微信公众号
AI工具推荐 视频效率加速

c# 大对象堆(LOH)碎片化和高并发性能下降

落磊小哥_5979

落磊小哥_5979

发布时间:2026-01-30 11:02:02

|

425人浏览过

|

来源于php中文网

原创

LOH碎片化会因无法分配连续内存而触发full GC,导致高并发下Stop-The-World并拖垮吞吐量;其根源是LOH不自动压缩,需通过避免大对象分配、及时归还ArrayPool缓冲区、分块处理等手段预防。

c# 大对象堆(loh)碎片化和高并发性能下降

LOH 碎片化如何影响高并发吞吐量

当 byte[]、string 或大型自定义对象(≥ 85,000 字节)频繁分配时,.NET 会将其放入大对象堆(LOH)。LOH 不在每次 GC 时压缩 —— 这是关键。碎片化后,即使总空闲空间足够,也可能无法满足下一个大对象的连续内存请求,触发 full GC(GC.Collect(2)),而 full GC 在高并发下会 Stop-The-World,直接拖垮吞吐量。

  • 典型现象:Gen2 GC count 暴涨,但 LOH size 没明显增长;监控中 % Time in GC 突增,且线程池 Worker Thread starvation 频发
  • 不是所有大对象都“安全”:即使你用 ArrayPool<byte>.Shared.Rent()</byte>,若租借后未及时 Return(),仍会退化为 LOH 分配
  • .NET 6+ 默认启用 GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce,但它只在下次 full GC 时生效一次,不自动周期执行

避免 LOH 分配的实操策略

核心思路是「不让大对象落到 LOH」,而非等它碎了再整理。

  • 拆分大数组:比如处理 1MB 日志缓冲区,改用 List<arraysegment>></arraysegment> + 多个 64KB byte[](
  • 优先复用:对固定尺寸大对象(如图像帧、Protobuf 序列化缓冲区),用 ArrayPool<t>.Shared</t> 并严格配对 Rent()/Return();注意 Return() 传 clearArray: true 可避免敏感数据残留,但有轻微性能开销
  • 禁用 LOH 分配(仅限 .NET 5+):启动时设置环境变量 DOTNET_gcAllowVeryLargeObjects=0,强制 >85KB 对象抛 OutOfMemoryException,倒逼代码提前暴露问题
var buffer = ArrayPool<byte>.Shared.Rent(1024 * 1024); // 1MB → 仍进 LOH!
try {
    // 实际使用
} finally {
    ArrayPool<byte>.Shared.Return(buffer, clearArray: false); // 必须 return,否则池耗尽后 fallback 到 new byte[]
}

诊断 LOH 碎片化的关键指标

别等服务卡顿才查 —— 直接看 GC 日志和 ETW 事件。

Excel公式大师(兼容WPS)
Excel公式大师(兼容WPS)

Excel/WPS 公式大师。用大白话描述需求,直接给出可用的公式、函数组合和数据处理方案,并解释每一段的作用。当用户提到"Excel 公式"、"表格函数"、"VLOOKUP 怎么用"、"XLOOKUP"、"LET"、"LAMBDA"、"动态数组"、"这个公式报错了"、"#N/A"、"#REF!"、"

下载
  • 启用 GC 日志:dotnet run --environmentVariables DOTNET_gcLog=1,关注日志中 LOH segment count 和 LOH fragmentation 字段
  • 用 dotnet-gcdump collect -p <pid></pid> 抓快照,加载到 PerfView,筛选 Object Type 含 System.Byte[] 且 Size ≥ 85000 的实例,按大小排序看是否大量“小而散”的大数组
  • Windows 性能计数器:.NET CLR Memory\# Bytes in LOH + .NET CLR Memory\% Time in GC 联动突增,基本可锁定

高并发场景下 GC 设置的取舍

服务器应用不是调低 GC 频率就万事大吉,要平衡延迟与吞吐。

  • 禁用后台 GC(GCSettings.IsServerGC = true 默认开启,但需确认):服务器 GC 比工作站 GC 更适合高并发,它为每个 CPU 核心维护独立的 heap,减少锁争用
  • 慎用 GC.TryStartNoGCRegion():它会在指定大小内禁止 GC,但一旦失败(如 LOH 不足),会立即触发 full GC —— 高并发下极易雪崩,仅适合已知内存上限的短时批处理
  • 监控比调优重要:在 K8s 中用 dotnet-counters monitor --process-id <pid> --counters System.Runtime</pid> 实时观察 gc-loh-size 和 gc-gen-2-collect-count,比盲目改配置更可靠

LOH 碎片化本质是内存使用模式和 GC 行为不匹配的结果。最常被忽略的是:开发阶段没压测真实数据体积,上线后突发大 payload(如上传 200MB Excel)直接打穿 LOH,此时再加 compaction mode 已晚。把大对象生命周期纳入接口契约(比如明确要求调用方分块上传),比依赖运行时补救更有效。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

7099

2023.08.02

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3648

2023.11.20

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3208

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

5269

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3869

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

486

2026.01.19

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6587

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2728

2023.08.10

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

0

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 45.2万人学习

成为PHP架构师-自制PHP框架
成为PHP架构师-自制PHP框架

共28课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn