.NET Core应用在Linux下获取进程内存信息的正确方法
这个问题我之前踩过同款坑,在跨平台的.NET Core应用里直接用Process类拿内存信息,确实会遇到Linux下返回0的情况,主要是因为.NET Core在不同系统上对Process类属性的实现逻辑不一样。下面给你几个亲测有效的解决办法:
一、调整
Process类的使用方式(适配Linux) Linux下Process的部分属性(比如PrivateMemorySize64)返回0,是因为它依赖系统的/proc文件系统,而有些属性的实现并没有完全适配Linux的proc结构。你可以换这些可靠的方式:
- 用
WorkingSet64属性:这个属性在Linux和Windows下都能正常返回,它代表进程当前占用的物理内存(包含共享内存部分),代码示例:var currentProcess = Process.GetCurrentProcess(); Console.WriteLine($"当前物理内存占用: {currentProcess.WorkingSet64 / 1024 / 1024} MB"); - 直接读取
/proc文件解析:如果需要更精细的内存数据(比如私有内存、虚拟内存),可以直接读取/proc/self/status或/proc/self/stat文件,手动解析字段。比如获取虚拟内存:
AWS Linux镜像默认普通用户就有权限读取这些文件,不用额外配置权限。var statusLines = File.ReadAllLines("/proc/self/status"); var vmSizeLine = statusLines.FirstOrDefault(line => line.StartsWith("VmSize:")); if (vmSizeLine != null) { var parts = vmSizeLine.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); if (long.TryParse(parts[1], out var vmSizeKB)) { Console.WriteLine($"虚拟内存占用: {vmSizeKB / 1024} MB"); } }
二、用.NET Core自带的GC类获取托管内存
如果你的需求只是关注.NET应用的托管内存使用(也就是GC管理的内存),那直接用System.Runtime.GC类更靠谱,完全跨平台:
// false表示不强制GC回收,直接返回当前托管堆内存大小 long managedMemory = GC.GetTotalMemory(false); Console.WriteLine($"当前托管内存占用: {managedMemory / 1024 / 1024} MB");
三、跨平台兼容的代码写法
如果要同时适配Windows和Linux,可以用条件编译指令区分平台,避免在Linux下调用那些无效的属性:
using System.Diagnostics; long memoryUsage; #if LINUX var process = Process.GetCurrentProcess(); memoryUsage = process.WorkingSet64; #else var process = Process.GetCurrentProcess(); memoryUsage = process.PrivateMemorySize64; #endif Console.WriteLine($"内存占用: {memoryUsage / 1024 / 1024} MB");
编译Linux版本时记得加上-p:DefineConstants=LINUX参数,或者在项目文件里配置条件编译符号。
总结
不需要额外安装系统工具,只要调整代码适配Linux的特性就行:要么换用Process类中跨平台可靠的属性,要么直接读取proc文件解析,或者用GC类获取托管内存。
内容的提问来源于stack exchange,提问作者Optional Option
相关产品推荐
相关产品推荐

