Blazor Server在Linux环境下内存占用过高且无法释放的问题求助
Linux环境下Blazor Server应用内存占用过高且无法释放问题
我在Linux环境运行的.NET Blazor Server应用出现极高内存占用,且内存始终无法释放。用户运行报表时确实需要1-2GB内存,但关闭标签页后资源应被释放,.NET也该相应释放部分内存,目前应用内存占用接近90-95%。
问题
- 因其他进程几乎无内存压力,无法判断服务器处于内存峰值状态,还是.NET在持留内存。
- .NET内存转储文件过大,不符合预期:下载大小约5-6GB,但分析后发现已用对象仅约30-300MB。
内存诊断信息
root@a9f25bad2d02:~/site/wwwroot# dotnet-counters monitor [System.Runtime] % Time in GC since last GC (%) 0 Allocation Rate (B / 10 sec) 209,648 CPU Usage (%) 0 Exception Count (Count / 10 sec) 0 GC Committed Bytes (MB) 105 GC Fragmentation (%) 43.752 GC Heap Size (MB) 68 Gen 0 GC Count (Count / 10 sec) 0 Gen 0 Size (B) 19,577,728 Gen 1 GC Count (Count / 10 sec) 0 Gen 1 Size (B) 1,608,856 Gen 2 GC Count (Count / 10 sec) 0 Gen 2 Size (B) 49,073,776 IL Bytes Jitted (B) 4,471,180 LOH Size (B) 26,161,384 Monitor Lock Contention Count (Count / 10 sec) 0 Number of Active Timers 15 Number of Assemblies Loaded 5,110 Number of Methods Jitted 64,067 POH (Pinned Object Heap) Size (B) 706,440 ThreadPool Completed Work Item Count (Count / 10 sec) 17 ThreadPool Queue Length 0 ThreadPool Thread Count 4 Time spent in JIT (ms / 10 sec) 0 Working Set (MB) 5,773 root@a9f25bad2d02:~/site/wwwroot# free -m total used free shared buff/cache available Mem: 7817 6858 121 19 837 740 Swap: 4095 2156 1939 root@a9f25bad2d02:~/site/wwwroot# top Tasks: 11 total, 2 running, 8 sleeping, 1 stopped, 0 zombie %Cpu(s): 1.5 us, 0.7 sy, 50.4 ni, 45.3 id, 2.2 wa, 0.0 hi, 0.0 si, 0.0 st MiB Mem : 7817.4 total, 89.3 free, 7262.5 used, 465.6 buff/cache MiB Swap: 4096.0 total, 1676.2 free, 2419.8 used. 341.3 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 74 root 30 10 9812340 5.4g 19812 t 0.0 70.7 21:22.97 dotnet 1908 root 30 10 13948 708 540 S 0.0 0.0 0:00.18 sshd 1910 root 30 10 5752 2040 1808 S 0.0 0.0 0:00.03 bash 2526 root 30 10 9780 3448 2972 R 0.0 0.0 0:00.00 top
从dotnet-counters monitor结果可见,工作集约为5.7GB,但所有代、大对象堆(LOH)及固定对象堆(POH)的总占用仅约120MB,这与分析5GB大小的内存转储文件得到的结果一致。
已执行操作
- 切换Server和Workstation GC模式,无明显差异。
- 执行
dotnet-dump collect --type Full收集内存转储,排查应用内的内存压力。 - 在应用中添加dotnet计数器,监控Gen 0、1、2、LOH及堆大小,这些指标在用户离开站点后会回落。
- 将应用切换到Windows环境运行,内存使用恢复正常,且会在一段时间后释放。
- 通过
dotnet-counters collect模拟典型用户负载,并绘制了GC Committed Bytes随时间变化的图表。
背景信息
- 应用为Blazor Server类型
- 部署在Azure的Linux App Service Plan(具体为P1v3)上
内容的提问来源于stack exchange,提问作者Adam A
相关产品推荐
相关产品推荐

