.NET Core转储分析:栈无函数参数时如何获取目标容量值?
从MSBuild OOM转储中获取MemoryStream扩容的目标容量?
在你描述的场景下,大概率没法直接从转储里拿到触发OOM的目标容量值,原因如下:
- 调用栈参数不可用:
!mdv显示所有函数参数为<UNAVAILABLE>,而MemoryStream扩容时的目标容量一般是方法参数或局部变量,这部分数据要么被内存覆盖,要么转储没完整捕获,没法直接读取。 - 转储捕获的是OOM触发后的状态:此时扩容操作已经失败,目标容量的临时计算值可能已经从栈上被清理,没有留存。
不过可以基于.NET MemoryStream的默认扩容逻辑做推测:
默认规则是当前容量小于256MB时翻倍,超过256MB后每次增加256MB。你当前的容量是724MB,按这个逻辑下一次扩容的目标容量应该是724MB + 256MB = 980MB左右,但这只是基于标准行为的推断,不是转储里的实际数据。
如果想试着碰碰运气,可以试试这些调试命令:
- 用
!dumpheap -type System.IO.MemoryStream遍历所有MemoryStream实例,看看有没有扩容过程中产生的临时对象残留; - 执行
!clrstack -a强制解析栈帧的局部变量,有时候!mdv拿不到的信息,这个命令可能能挖出一点,但成功率不高。
内容的提问来源于stack exchange,提问作者mark
相关产品推荐
相关产品推荐

