问题标签 [vmmap]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
923 浏览

c# - Vmmap 托管堆(私有工作集)是 GC 堆总大小的 10 倍

我试图了解我的应用程序的 RAM 利用率,并与以下观察结果混淆。

  • VMMap 显示我的应用程序的托管堆大小约为 110 MB,并且几乎全部位于私有工作集(私有 WS)中

http://www.imageno.com/6c7tcszsgw86pic.html

如果我使用 windbg 或 debugdiag 查看完整的内存转储,则总 GC 堆大小仅为 16 MB 左右。

我如何解释这些数据?为什么进程在托管堆中有如此大的 PrivateWS 无法在内存转储中跟踪?

是因为 ASP.NET 的内存囤积特性吗?有没有办法在进程的内存转储中确认这一点?

根据 VMMap, Private WS是分配给无法与其他进程共享的类型或区域的物理内存量。

关于如何收回未使用的 RAM 有什么建议吗?

0 投票
0 回答
89 浏览

c# - 可以枚举在全局空间中创建的内存映射文件吗?

我想这样做:

var globalMemoryMappedFiles = Directory.GetFiles(@"Global\");

但根据我的经验,它不起作用。有没有办法枚举全局空间中的内存映射文件?

我知道 VMMap(https://technet.microsoft.com/en-us/sysinternals/vmmap.aspx)在其“可共享”部分显示内存映射文件,但我不知道它是如何做到的。我已经查找了 VMMap 代码,但我不确定它是开源的。

0 投票
1 回答
863 浏览

c# - VirtualAlloc 的断点取决于分配大小

我有一个 .Net 应用程序(Windows 服务),它在运行一段时间后消耗大量非托管内存,直到它崩溃OutOfMemoryException此问题中的更多信息(已删除;仅限 10k 用户)。

我设法创建了一个主管程序来扫描该应用程序的资源消耗,使用 VMMap 获取内存定期内存快照,并VirtualAlloc()使用以下命令在函数处设置断点(为便于阅读而格式化):

但是 WinDBG 输出显示了一些奇怪的值,我无法跟踪 VMMap 显示的相同分配,所以我认为RDX( source ) 是条件断点上的一个错误寄存器。

我需要设置一个正确的断点来跟踪非托管内存分配和堆栈跟踪,最后找到有罪的代码。

更新: 这是带有本机堆栈的断点的示例输出。我认为此处显示的字节不准确,因为 VMMap 没有显示该大小 (3.6GB) 的任何分配。一件奇怪的事情是,该字节值显示在倒数第二个堆栈帧上,作为clr!CExecutionEngine::ClrVirtualAlloc(参见 d8040000 值)的参数。

0 投票
0 回答
116 浏览

.net - .NET 2.0 ThreadPool 线程堆栈增加导致内存不足异常(已达到提交限制)

操作系统:Windows 7 嵌入式

内存:1 GB

分页文件大小:500 MB

剩余磁盘空间:~1 GB

.NET:2.0

我正在开发一个在 Windows 7 Embedded 上运行的用 C# 编写的 .NET 2.0 Winforms 应用程序,其中系统只有 1 GB 的 RAM,并且可用磁盘空间相当有限(~1 GB)。我们正在从 Windows XP Embedded 迁移到 Windows 7 Embedded,虽然我们的程序在 Windows XP 上运行良好,但由于 Windows 7 上的内存不足异常,它已经失败了好几次。我们添加了一个 500 MB 的页面文件,因为失败( Windows 7 Embedded 的默认值似乎是 0MB 的页面文件大小)。但是,由于我们已将由程序提交的内存增加引起的内存不足异常缩小,因此系统提交限制可能会在足够长的时间内达到,即使是分页文件也是如此。我们无法快速将硬件迁移到更合适的位置,

使用 SysInternals VMMap 工具,我们可以看到程序的虚拟内存中线程堆栈的数量随着时间的推移缓慢增加,最终在程序提交的内存导致系统超出其提交限制时导致失败。线程堆栈增加的原因已与 .NET 2.0 ThreadPool 隔离,由于某种原因,它会随着时间的推移创建净正数的线程。我们认为这是因为在我们的代码中过度使用了 System.Timers.Timer 类,每个实例都在 ThreadPool 上运行其计时器已过事件处理程序,尽管仍然不清楚为什么 ThreadPool 会保留这么多线程,即使在假设它们并不总是被计时器回调使用。其中一些事件处理程序处理信息的时间超过了 ThreadPool 线程的理想时间,

我们已经为这个问题想出了几种可能的解决方案,包括限制 ThreadPool 工作线程的数量,将运行时间较长的计时器回调换成线​​程,以及迁移到更高版本的 .NET。最后一个解决方案假定 ThreadPool 管理器的优化已经在 .NET 的迭代中进行,这可能有助于缓解问题。是否还有其他我们遗漏的明显(或不明显)解决方案?

编辑:在进一步检查中,生成并保留的 ThreadPool 线程具有以下调用堆栈:

0 投票
0 回答
197 浏览

c - VMMap 中的地址是否可读?

我正在使用 VMMap 查看进程的地址空间。左下角是地址。我试图复制地址并从进程中读取它。

这是一个例子:

在此处输入图像描述

我试图看看我是否可以用下面的一些快速代码来读取这个地址。调用VirtualQueryEx不会失败,因为响应不是0。但是,我的问题是State返回一个值,表明地址不存在并Protect返回PAGE_NOACCESS

在此处输入图像描述

代码:

VMMap 中的地址是可读的还是我做错了什么?

0 投票
0 回答
265 浏览

vmmap - VMMAP 工具上的堆分配和调用树按钮已禁用

我了解堆分配按钮应该允许我查看调用堆栈,但无论我尝试什么,该按钮始终处于禁用状态(灰显)。(我使用“启动和跟踪新进程”功能来运行我的应用程序,但它没有帮助。)

谢谢兰巴布在此处输入图像描述

0 投票
1 回答
185 浏览

memory - Visual Studio 不会显示的其他托管堆内部有什么?

我的 ASP.NET Core 2.2 Web 应用程序在 .NET Framework 4.7.2 上运行,在空闲启动后使用超过 220MB+。

220MB 很高——因为它在一个小型 Azure 应用服务计划中运行,我想看看可以做些什么来减少内存使用量。Visual Studio 的诊断工具窗口显示托管对象堆仅占 220MB 中的 11MB。

对该解释不满意(另外 209MB 去哪儿了?!)我使用 VMMap 进行查看,它报告 85MB 进程的私有字节是不同的托管堆 - 而不是 Visual Studio 报告的 11MB。

这是一个屏幕截图:

我知道 Visual Studio 在内存快照中报告的 11.5MB 堆可能对应于 VMMap 中的第一个子行(Gen0使用 的堆11,523 K) - 但是其他类似大小的堆(10.3MB、9.9MB、9.4MB、 9.0MB, 5.7MB) - 里面有什么,为什么 VS 不报告它们?如果它们与应用程序无关,那么当进程不在调试器下运行时,为什么进程的内存使用率如此之高?

在此处输入图像描述

0 投票
1 回答
262 浏览

bash - 如何在 MAC OS Catalina 上获取有关进程内存映射状态的信息

我需要获取有关进程内存映射状态的信息以查找内存映射段、堆和堆栈片段。

在 Linux 上,命令/proc/<PID>/maps显示有关进程内存映射状态的信息。在 MAC 上,我尝试使用vmmap PID命令,但在此命令发出的信息中找不到有关内存映射段、堆和堆栈片段的信息。

信息应按以下格式显示:

例如,我需要找到:堆 - 556dff36b000-556dff4e3000,堆栈 - 7ffe96b2c000-7ffe96b4d000,彩信 - 7f558b397000-7f558b3a2000。

0 投票
0 回答
85 浏览

ios - 如何检查 VMMap 中哪个框架使用了 DefaultMallocZone

我的项目有一个从 Xcode 导出的 memgraph 文件。试图分析哪个框架使用更多内存。我能够看到使用 __DATA 的框架。但无法检查哪个框架分配了以下内存

MALLOC_SMALL 64.0M 1280K 1264K

MALLOC_TINY。13.0M 3264K 3264K

DefaultMallocZone_0x104858000 55.8M 4768K 4752K

提前感谢您的帮助

0 投票
1 回答
64 浏览

debugging - 在特定进程停止之前获取其内存消耗的历史数据

我有一个进程(它是一个 Windows 服务)。它抛出 bad_alloc 异常并停止。后来它被另一个监控工具启动。我想在它停止之前查看特定于该进程的内存相关详细信息。

Process explorer、VMmap 等工具可用于运行进程。但是,随着我的流程停止,我们在这里丢失了数据。有没有办法记录这个过程的数据直到它停止/直到某个时间段?

我在 VMmap 中尝试了 2 个相同的选项。

(a) 查看正在运行的进程选项工作正常,但它需要用户定期“刷新”,如果进程停止/重新启动(现在使用新的 PID),则在刷新期间,以前的数据会丢失。

(b) 启动并跟踪一个新进程(这里我有每秒自动刷新的选项) - 但它无法启动我的 Windows 服务。

您能否建议是否有其他方法?

我为此参考了多篇文章,但没有一篇对我有帮助。

捕获日志的原因是 - 这些服务在客户机器上的生产系统中,因此无法在发布时进行分析。