问题标签 [unmanaged-memory]

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 回答
32 浏览

c# - 从非托管内存返回一个通用引用

我有一个通用类

}

现在我想修改数组中的元素。就像是

我做不到因为

无法修改 Array.this[int] 的返回值,因为它不是变量。

我完全理解这个错误,因为T它是一个 ValueType,因此是不可变的(通过副本返回)。

有什么方法可以ref return在我的索引器属性中创建一个?

PS:T不能是引用类型。它必须是 ValueType。

0 投票
2 回答
107 浏览

c# - 内存泄漏分析和帮助请求

我一直在使用Shivprasad Koirala 概述的方法来检查 C# 应用程序 ( VoiceAttack ) 中运行的代码是否存在内存泄漏。它基本上涉及使用性能监视器来跟踪应用程序的私有字节以及所有堆中的字节,并比较这些计数器以评估是否存在泄漏以及什么类型(托管/非托管)。理想情况下,我需要在 Visual Studio 之外进行测试,这就是我使用这种方法的原因。

以下代码部分生成以下内存配置文件(请记住,与 Visual Studio 相比,该代码的格式略有不同,因为这是包含在主 C# 应用程序中的一个函数):

在此处输入图像描述

您可以看到,在运行此代码后,私有字节数不会恢复到原始计数,并且所有堆中的字节数大致保持不变,这意味着有一部分非托管内存未释放。连续几次运行相同的内联函数不会导致观察到的最大私有字节数或未释放内存进一步增加。一旦主 C# 应用程序 (VoiceAttack) 关闭,所有相关内存(包括上述代码的内存)都会被释放。坏消息是,在正常情况下,主应用程序可能会被用户无限期地运行,导致分配的内存保持未释放。

为了更好地衡量,我将相同的代码放入 VS(Thread.Sleep(5000)在块之前和之后添加了一对using以便更好地进行图形分析)并构建了一个可执行文件以使用性能监视器方法进行跟踪,结果是相同的。OpenFileDialog 有一个初始的非托管内存跳转,分配的非托管内存永远不会回到原始值。

上面概述的内存和泄漏跟踪方法是否有意义?如果是,是否可以采取任何措施来正确释放非托管内存?

0 投票
0 回答
30 浏览

c# - 使用从 COM 对象返回的接口数组

我有一个 COM dll(本机),我想在我的 c# 项目中使用它,这个 dll 有一个函数可以获取一个 IntPtr 参数,如下所示:

当我将 IntPtr 变量传递给函数运行时没有任何错误,但在调用函数后,当我想使用 paramInterfaceArray 读取参数接口数组时,出现错误访问冲突执行位置。我尝试了很多解决问题的方法,但任何一种都有效。有谁能够帮我?

0 投票
0 回答
107 浏览

c# - 内存不足异常/清理非托管内存

无论如何,我正在尝试从应用程序的某个窗口录制视频(该窗口显示了一些使用 DirectX 构建的图形)

我实际上正在做的是,从该窗口拍摄快照并将其从 Aforge.net 传递给 AVIWriter,我每秒重复该过程 20 次以获得 20fps 的视频。

在 30 到 40 秒内一切正常,再过一段时间就会出现内存不足异常。在使用 JetBrains dotMemory 进行分析后,我发现非托管内存正在迅速增加。尽管调用 Dispose() 是为了删除分配。内存消耗仍然很高。我也尝试过使用

但在这里我的代码没有成功,它在Backgroundworker中运行,每50毫秒重复一次,直到点击CancellationPending按钮。

0 投票
1 回答
30 浏览

memory-management - 我无法解释这个图:“内存泄漏”与否?

我在尝试理解内存使用图时遇到问题,希望在内存管理方面更有经验的人能够判断我是否面临内存泄漏问题

为了执行这个测试,我有一个自定义的 PS1 脚本,它将运行一个无限循环并每隔 X 秒持续发布大量数据,这与我在生产中所期望的非常相似。

我的应用是作为 Windows 服务运行的 .NET Core 控制台应用。没有使用第三方组件、外部库、原生 API 等。它是一个典型的多线程应用程序,它发出 HTTP 请求、写入磁盘、向前端应用程序发送通知。

托管与非托管内存演变 在此处输入图像描述

非托管内存释放 在此处输入图像描述

当服务首次启动时,它只使用 33 MB。在第一个请求之后,它会跳转到 100 MB。在每个连续的请求中,内存都会以非常缓慢的速度增长。底部较小的图表显示了我进行测试时当晚的演变。看起来在某些时候内存会稳定在 500-600 MB。我看到托管内存被收集,不像我预期的那样频繁,但最终它被收集了。然而,正如我之前所说,非托管内存遵循自己的趋势,增长非常缓慢甚至稳定。在奇怪的情况下,我会说几乎随机地释放非托管内存(参见第二个捕获),但最终它会再次建立。

您在这里看到内存泄漏模式吗?

0 投票
1 回答
139 浏览

c# - 编组指向结构异常“无法读取或写入受保护内存”的指针数组的指针

我正在将本机 C++ 库翻译成 C#。原始函数分配结构的一些内存,对当前进程进行一些内存操作,并将操作后的字节返回到结构内的字节缓冲区。

该结构定义如下:

原函数定义如下:

并且分配顺序是

这是我尝试过的:

结构编组:

内存分配:

DLL导入:

最后是函数调用:

我有时间调试我是否错误地编组数据,或者我是否必须进行一些手动编组以摆脱异常:“尝试读取或写入受保护的内存。这通常表明其他内存已损坏。”在函数调用。

0 投票
2 回答
1657 浏览

c# - .net 非托管内存泄漏

我有一个 Windows 服务来接收使用 OpenPop 的电子邮件。但是,重新启动后大约 3 天,内存使用量会上升到 8G。操作人员给了我一个dump文件,所以我用windbg来分析。

当我跑步时,!address -summary我得到:

!eeheap -gc我得到了:

从这两个命令中,有一些非托管内存泄漏。如何找出非托管内存中的内容以及通过什么方法?

0 投票
1 回答
679 浏览

c# - C# 调用一个 DLL 函数,该函数返回一个指向结构数组的指针的指针

我已经尝试了各种方法的许多不同组合来编组这个调用。这是一个 DLL,它返回一个指向结构数组的指针的指针。像 debugPort 这样的类型实际上是枚举。

我尝试替换使用“out”和“ref”选项。我试图找到它喜欢的 IntPtr 版本。我不断收到:System.AccessViolationException。我已经联系 STMicroelectronics 关于如何与这个 DLL 接口,但到目前为止他们没有任何帮助。DLL 中的其余调用非常简单,但我必须让这个调用开始,因为它是关于实际连接的 JTAG 设备的信息。

更新(20 年 6 月 12 日)以添加实际的调用函数,现在调用函数将结构从非托管结构复制到托管结构。但是对 getStLinkList() 的调用仍然不起作用。

我也尝试了这些更改,但没有运气。我仍然看到访问冲突。尝试读取或写入受保护的内存。

0 投票
0 回答
37 浏览

c# - 如何在 C# 中检查 C 指针的有效性?

非托管指针被传递给 C# 中类的方法。在操作之前,我需要确保指针分配了声明的大小并且仍然有效(尚未释放)。这怎么可能?

0 投票
1 回答
193 浏览

c# - UWP 应用程序的非托管内存分析?

我一直在寻找一种工具或技术或任何可以帮助我找到 UWP 应用程序中的哪些对象在非托管堆内存上分配的东西。

我尝试查看用于跟踪对象的WPR/WPA组合。但是,在那里没有发现任何有用的东西。(如果你有这个组合的 UWP/WPF 应用的好链接,请分享)

我安装了Ant Memory profiler,但他们似乎不再有 Windows Store 应用程序的任何选项。

我检查了.NET 内存分析器,当我尝试加载“Windows Store App”时。.NET 分析器一直卡在“尝试加载 .NET 内存”……卡住了。

我正在寻找任何可以帮助我了解非托管内存泄漏问题的方法/技术/工具。

我正在处理的应用程序...它具有 .NET 核心组件、本机 CPP 组件、UWP 组件,如果没有任何广泛的笔划提示,很难追踪内存泄漏问题发生在哪里。

(PS:目前,我正在尝试检查是否可以使用 WinDbg 来分析 UWP 应用程序的堆转储)

感谢您的阅读。