问题标签 [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 投票
2 回答
1825 浏览

java - java内存压力

Java 中是否有功能可以告诉运行时有关非托管内存分配的信息,例如.NET 中的 GC.AddMemoryPressure 方法

0 投票
2 回答
797 浏览

c# - 在托管代码中填充非托管数组

我有一个托管程序,它与非托管 DLL 库合作。

库构造一个对象,它要求(通过转换为委托的回调函数)托管主机填充非托管数组。数组本身通过指针 (IntPtr) 连同有关其大小的信息一起传递。这种类型是双方都知道的。关键是,如何安全地用托管代码中的数据填充非托管数组?有两个限制:没有不安全的代码,最好没有创建额外的数组。如果存在,则该数组可能会以另一种方式传递。

让回调具有以下原型:

让委托具有以下原型:

0 投票
2 回答
6330 浏览

c# - 将非托管内存复制到托管字节数组

我需要将非托管内存读入托管字节数组。

为此,我有一个对非托管内存的 IntPtr 引用和一个表示我感兴趣的非托管内存大小的长度。

我使用以下代码将其读入托管字节数组。

但是,这会导致性能非常差。使用 256KB 的非托管内存调用此方法 1000 次,耗时超过 7 秒。我认为必须有一种更有效的方法来做到这一点。

我不能使用 Marshal.PtrToStructure 因为我不知道需要预先读取的内存大小。

关于如何提高此功能的性能的任何想法?

0 投票
3 回答
700 浏览

wpf - 非托管对象的 WPF 性能问题

我用 C# 在 WPF 中开发了一个应用程序。该应用程序包括用于在特定窗口中显示相机的第三方 dll。

通常应用程序在没有相机对象(非托管对象)的情况下占用 90 MB - 135 MB 的内存。即,我在设计和代码页(xaml 和 xaml.cs)中删除了所有重新设置相机对象的代码。内存增加并停止在一个最大值。

如果我在应用程序中使用相机对象,内存会逐渐增加。当我每次打开相机窗口时,内存会逐渐增加,比如 135 MB 141 MB,143 MB ......

我已经在所有必要的地方使用了GC.CollectUsing语句来清除托管内存。我无法减少或停止内存增加。

如何解决这个问题?

任何建议将不胜感激

提前致谢。

0 投票
2 回答
711 浏览

c# - .NET 应用程序突然出现非托管内存的极端增长

我正在运行一个应用程序,它表现出一些非常特殊的问题。它可以正常运行大约 2.5 小时,然后突然非托管内存开始增长,并且增长迅速。在大约半小时左右的时间内,应用程序崩溃了。

应用程序未使用任何非托管 DLL。它正在与外部应用程序通信。它使用套接字(通过流使用)写入并通过 WCF 流读取。

我用 ANTS 对其进行了分析。非托管内存利用率的突然变化非常惊人;它永远保持完全平坦,然后突然开始上升并以稳定的速度继续上升,直到应用程序失败。托管内存中似乎没有什么不合适的。

鉴于我不是故意使用非托管代码,因此很难确定泄漏的来源。蚂蚁没有帮助。当代码从一开始就不是稳定增加时,很难清理代码的问题(应用程序一直处于空闲状态,尽管它确实每秒通过套接字用非常少量的数据 ping 它的服务器一次)。

再次迭代,这段时间应用程序和服务器都处于空闲状态;这是在一个隔离的测试系统(服务器和客户端)上运行的。客户端是泄漏的那个。

0 投票
1 回答
693 浏览

c# - 使用 UTF8 编码将 C# 字符串写入预分配的非托管缓冲区

我需要将 C# 字符串写入编码为 Utf8 的预分配非托管缓冲区。回答之前,请阅读以下要求

  • 没有新的分配(所以请不要让我回答涉及创建字节数组或其他实例化的问题)
  • 没有到非托管代码的转换(没有 pinvoke/calli)

目前,我正在使用 OpCodes.Cpblk 使用 16 位字符将原始字符串从 C# 复制到非托管缓冲区。这给了我与在 x64 架构上使用非托管 memcpy 大致相同的性能,我真的需要接近那个吞吐量。

我正在考虑将字符串固定char * 并对其进行迭代,但是在性能方面实现没有跳转表的编码器既麻烦又不理想。

0 投票
1 回答
4119 浏览

c++ - 将托管字节数组转换为非托管字符串

我正在尝试在我的 C++/CLI 包装器中将托管字节数组转换为 std::string;但是,我稍后会在堆中看到一些损坏的内存。只是想检查我是否正确地进行了转换。下面是我的方法是 CLI:

上面的代码有什么问题吗?

0 投票
0 回答
151 浏览

c# - How can error in external API depend on calls to GC.Collect() in main application?

I have been trying to explaing this behavior in my c# optimization routine.

The program creates and solves large LPs using the cplex 12.2 API in a subroutine. For the purpose of hunting this bug, I changed it so that it solves the same problem repeatedly. After solving, I call cplex.End() on the instance, and the cplex instance goes out of scope, so the memory will be deallocated.

The second time I create the model and call cplex.Solve(), it does not solve the model. It gives the error: "CPLEX error 1217: No Solution Exists", which is not so credible since it solved the same problem the first time. (memory requirements at the moment of the crash were just 1.3 GIG)

Now, if I force a garbage collect between the two solves, cplex solves the model the second time as it did the first time.

Can anyone explain this behavior to me? And the way to properly fix it?

0 投票
1 回答
481 浏览

c++ - 从终结器对非托管内存的访问冲突

我试图从 c++/cli 终结器中清理非托管类的内存,它给了我 AcessViolation 错误。我做这样的事情:

有谁知道,有什么问题吗?感谢您的回答。

0 投票
1 回答
1577 浏览

.net - .NET 应用程序中与本机堆相关的内存泄漏

我们有一个 .NET 2.0 应用程序,它是一项服务,主要通过 .NET 远程处理连接多个客户端。该服务在生产期间在客户端站点因OutOfMemory 异常而崩溃,因此目前他们被迫每天左右重新启动它以避免意外崩溃。

以前,我已经成功解决了托管代码中的几个内存泄漏案例(静态集合未清理保存在其中的对象,以及另一个逻辑线程数不断增加的案例)。所以我非常熟悉捕获内存转储并使用 WinDbg + SOS 搜索它们。

然而,在这种情况下,私有字节正在上升,而所有堆上的字节保持稳定,这表明非托管代码内存泄漏。我收到了带有实际 OOM 异常的故障转储,这使得它更加明显:

!address -摘要

查看 Tess Ferandez 的关于处理 .NET 应用程序中非托管代码泄漏的博客以及网络上的其他一些资源,我排除了诸如大量动态程序集、常见XmlSerializer问题或3rd 方本机 DLL等问题(有没有)。但是,周围有很多P/Invokes。继续前进,检查堆返回给我以下信息:

堆

第二个命令也返回了所有条目。现在,根据我读到的一些东西,我应该运行 !heap -p -a 来获取堆栈,但我得到的只是

这个

根据这个问题,这是不正确的 gflags 使用等。但是,在本地启动服务并在其上附加调试器,目前不是一种选择。长话短说,我必须设置一个具有与客户端类似的配置和负载的环境才能完成它,但这还没有准备好。

所以,我很困惑。我不知道从哪里开始,或者即使我使用正确的方法来解决该问题。任何指针都非常受欢迎。

编辑#1:使用外部资源的线程上的 Thread.abort。具体来说,数据库连接通过 Oracle 的 ODP.NET 提供程序。这可能是本机堆泄漏的原因吗?