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

c# - 如何在非托管内存中实例化 C# 类?(可能的?)

更新:现在有一个“有效”的公认答案。你不应该,永远,永远,永远使用它。曾经


首先让我先声明我是一名游戏开发者,以此作为我的问题的序言。想要这样做有一个合法的 - 如果非常不寻常 - 与性能相关的原因。


假设我有一个这样的 C# 类:

没有什么花哨。请注意,它是一个仅包含值类型的引用类型。

在托管代码中,我想要这样的东西:

该功能NewInUnmanagedMemory会是什么样子?如果不能在 C# 中完成,是否可以在 IL 中完成?(或者也许是 C++/CLI?)

基本上:有没有办法 - 无论多么hacky - 将一些完全任意的指针转换为对象引用。而且 - 没有让 CLR 爆炸 - 该死的后果。

(提出我的问题的另一种方式是:“我想为 C# 实现一个自定义分配器”)

这导致了后续问题:当面对指向托管内存之外的引用时,垃圾收集器会做什么(特定于实现,如果需要)?

并且,与此相关的是,如果Foo将引用作为成员字段会发生什么?如果它指向托管内存怎么办?如果它只指向分配在非托管内存中的其他对象怎么办?

最后,如果这是不可能的:为什么?


更新:到目前为止,这是“缺失的部分”:

#1:如何将 an 转换IntPtr为对象引用?尽管 IL 无法验证(见评论),但它可能是可能的。到目前为止,我没有运气。该框架似乎非常小心地防止这种情况发生。

(如果能够在运行时获取非 blittable 托管类型的大小和布局信息,那也很好。同样,框架试图让这成为不可能。)

#2:假设问题一可以解决——当 GC 遇到指向 GC 堆外的对象引用时会做什么?它会崩溃吗?Anton Tykhyy在他的回答中猜测它会的。考虑到该框架对防止#1 的谨慎程度,它似乎确实很有可能。能证实这一点的东西会很好。

(或者,对象引用可以指向 GC 堆内的固定内存。这会有所不同吗?)

基于此,我倾向于认为这种 hack 的想法是不可能的——或者至少不值得付出努力。但我很想得到一个涉及#1 或#2 或两者的技术细节的答案。

0 投票
0 回答
805 浏览

c# - .net 4 应用程序池中的非托管内存

我正在尝试在 .net 4 应用程序中追踪一些非托管内存的来源

(这是好奇心……我没有什么大问题,我只是想知道它是什么)

我的应用程序当前包含 1 个文件:index.html - 包含“hello world”

从内存分析器中,我加载了 index.html 并且它消耗的很少(事实上,配置文件并没有启动 int)

然后我加载 /fish(它不存在),现在突然我们总共使用了大约 57MB,其中 54MB 是非托管内存。

对于一个空的应用程序来说,这似乎有很多内存 - 以及非托管内存中的内容

有一个 2.4MB 的“分配给 .NET 的未使用内存”,这是我完全预料到的。

奇怪的是,如果我将应用程序池切换到.net 2,内存不会以这种方式跳跃

正如我所说,我很好奇,但我在网上找不到任何关于它的信息。

0 投票
1 回答
118 浏览

.net - .net 内存管理的几个问题

我已经在 .net 中阅读了一些关于内存管理的想法,但是我没有回答以下三个问题

  1. 非托管资源在用于托管资源的同一托管堆中获取内存以及谁分配它(OS OR CLR 或其他任何东西)?
  2. 在托管资源 R 上调用 Dispose() 方法,将立即释放该 R 占用的内存以及 R 占用的所有其他非托管资源
  3. Who 清除被取消管理的资源(OS OR CLR 或其他)占用的内存。

欢迎任何帮助。

0 投票
1 回答
2078 浏览

wpf - 高非托管内存 - WPF 应用程序

我即将部署我的新 WPF 应用程序,我刚刚在任务管理器中注意到它消耗了大量内存。因此,我下载了 RedGate Antz 的试用版,试图找出导致此问题的原因,我震惊地看到大约 90 MB 的非托管内存使用情况。因为 Antz 不支持未损坏的内存,所以我尝试使用 Windbg,它本身并没有指向高使用率。这让我相信它一定是我正在加载的 DLL 之一。我在我的应用程序中使用 DevExpress 控件。

一个有趣的功能是当我最小化我的应用程序时,内存从 110 MB 下降到大约 6-10 MB。

我应该担心/担心吗?

这是我的第一个 WPF 应用程序,我不完全确定在内存使用方面会发生什么。最小化此内存的事实是否会重新获得/放弃表明一切正常?

关于可能导致此问题的任何想法或想法将是最有帮助的。

0 投票
1 回答
253 浏览

memory-management - 将托管数据转换并保留在内存中一段时间

我正在围绕 C++ 项目编写 C++/cli 包装器,以便可以从 C# 调用它。C#端调用一个cli方法[say Put(String^ key, String^ value)]数百万次传递一大组key/value托管数据,然后再调用[say Commit()]询问C++对象对数据做一些事情。我需要能够将所有数据保留在内存中,直到最后一次调用 - 所以我使用 std::vector 并尝试将所有托管字符串转换为非托管 std::string 并将它们保存在我的 cli 中的向量中代码。

我的问题是——在这种情况下转换托管数据的最佳方法是什么?固定托管数据以保持非托管指针有效似乎是个坏主意,因为数据不会立即使用(如果固定在函数调用后立即超出范围,这也将不起作用 - 这会导致访问失效)。另一种选择是通过 malloc 分配一个“足够大”的缓冲区并继续向其中添加数据——如果这样更好,那么:(1) 是 pin-ptr 后跟一个 memcpy (一旦 Put 方法,固定将超出范围返回)转换/复制单个 String^ 数据的最佳方式?(2)由于我不知道maloc的总大小,从初始malloc扩展内存的最佳方法是什么?对于这种情况,我将不胜感激任何指向一个好的设计解决方案的指针。

0 投票
1 回答
1805 浏览

android - 通过java使用本机内存

有时,需要绕过应用程序的堆内存限制并使用超出允许范围的内存。

我想到了一个解决方案,其中包括一种缓存机制,它将字节存储在本机内存中(不是在堆内存中,而是在非托管内存中)。

当然,我会考虑系统的最大可用大小。

所以,对直接缓冲区有所了解,我用它在本机内存中存储了一个字节数组:

但是,似乎在 Android 上,用于此的内存是在堆中使用的,而不是在本机内存中使用的。

到底是怎么回事?是否有一种简单的替代方法可以从本机内存存储和加载数据?

0 投票
3 回答
868 浏览

.net - .Net 应用程序中极端私有字节使用情况分析,本机内存泄漏?

我们有一个 .Net 网站正在运行,它使用了大量的私有字节:4,45 GB 及以上。这发生在多个网络服务器上,但似乎没有模式。

借助其他一些答案,当然还有Tess Ferrandez 的博客,我们已经使用DebugDiag和 WinDbg(Win8 SDK的一部分)获得了很多信息:

  • 我们知道只有一个分配消耗超过 3 GB: 在此处输入图像描述

  • 我们知道它是本机内存: 在此处输入图像描述

  • 我们知道它分配在堆 1 上: 在此处输入图像描述

从这里开始,我们被困住了。建议的命令(!heap -stat -h、!heap -flt s 和 !heap -p -a)也可以在此处找到,但并未向我们提供有关此行为原因的信息。

有没有人见过这个?是否有其他方法或命令可以查看导致 nativerd(IIS 的本机代码配置阅读器)发狂的原因?

0 投票
1 回答
1901 浏览

c# - 对内存位置的无效访问 - 托管到非托管代码

我在 c++ 中有这个代码,我通过 dll 导出:

我从 c# 调用 dll,这就是我在那里写的:

这是对 Init 的调用:

对于上述所有代码,当我运行 c# 应用程序时,有时会在 x64 机器中出现以下异常:

如何在不从编译中删除任何安全标志的情况下修复此代码?修复的代码示例真的很受欢迎!

谢谢!

0 投票
2 回答
2202 浏览

vb.net - 内存不足异常 - 非托管内存

我正在开发一个网络爬虫,它通常工作得很好。它将浏览大多数网站上的数千个页面,并成功完成,没有任何问题。

在一些网站上,我反复看到同样的问题。


编辑: 我使用 perfmon 来确定泄漏发生在非托管内存中。我知道,因为随着程序运行,“私有字节”不断增加,而所有堆中的字节保持稳定。

(实际上,它上升和下降,但逐渐攀升。它通常在我上面列出的代码部分中耗尽内存,但我不认为该部分是原因,而是可能是第一个受害者,因为它使用了大量内存...我认为它会在之后发布它)


编辑2:

我按照这个网站上的指示:http: //www.codeproject.com/Articles/42721/Best-Practices-No-5-Detecting-NET-application-memo

我使用 debugDiag 来检查程序。

分析数据后,调试诊断告诉我泄漏的原因:

我没有在我的应用程序中引用 jscript.dll,它必须被我正在使用的 Web 浏览器控件使用。

这是我的猜测,至少。

我还收到一个消息框,弹出标题为“来自网页的消息”,其内容是“X 行内存不足”。

所以,我想我可以处理 webbrowser 对象并取回我的记忆 - 所以我添加了一个带有以下代码的按钮:

所以,在运行了一段时间后,我停止了抓取并点击了我的新按钮......它根本没有任何区别。我正在观看 perfmon 中的总“Private Bytes”,它甚至没有动。

任何想法,任何人?


编辑3:

我尝试了一堆推荐的解决方案,但似乎都没有奏效。

有人建议这可能是由于图像未从缓存中清除,但我禁用了图像加载,所以我知道这不是问题。

我也听说IE7有问题,升级到IE8就可以解决。我有IE8,它仍然泄漏内存。

有人建议使用 webbrowser 控件最小化表单会释放一些内存。我试过了,它没有任何区别。

我还被告知我不应该期望内存使用量会下降,因为我将不得不等待垃圾收集器。这不是托管代码中的泄漏,因此 GC.Collect() 不会做任何事情。它在非托管内存中。显然,javascript 功能使用不同的内存,并且没有手动方式来强制收集。但是它已经到了崩溃的地步,所以显然存在问题。

我在这个问题上增加了 50 的赏金,我会将它奖励给任何帮助我解决泄漏的人。我想尝试这个解决方案:http: //www.codeproject.com/Questions/322884/WPF-WebBrowser-control-vs-Internet-Explorer-browse 但我无法弄清楚 vb.net 的等效项是什么。我尝试过在线转换器,但在转换此代码时它们会出错(尽管它们对于我过去转换的其他代码工作正常)

如果我无法解决泄漏,我会将它奖励给将我上面提到的页面从 c# 转换为 vb.net 的任何人。

我的后备计划是创建一个仅包含 webbrowser 的单独应用程序,并与该进程通信,直到它内存不足,此时我将重新启动它(当我完全关闭我的应用程序时,内存被释放)。这对于我的应用程序来说远非理想,因为网络浏览器非常紧密地融入了我的项目。


编辑 4

我尝试实施建议的 javascript 注入 - 这是我的代码:

(我在导航到新页面之前触发它)

不幸的是,我仍然看到 perfmon 中的隐私字节在增加。

谁能看出我的逻辑有任何缺陷?我正在尝试实施此修复: http: //www.codeproject.com/Questions/322884/WPF-WebBrowser-control-vs-Internet-Explorer-browse

顺便说一句 - 我使用这样的简单代码对其进行了测试:

和这个:

它在两个测试用例中都显示了消息。

奇怪的是,当我尝试通过这样做来测试脚本注入时:

我没有看到文本框中反映的注入代码 - 我看到的唯一变化是出现了“测试”一词(当页面从 documentCompleted 事件完成加载时,我运行代码 RTB_RawHTML.Text = wbMain.DocumentText...)

0 投票
2 回答
1854 浏览

c# - 将数据从 C++ 传递到 C# - 映射文件与 CLI+UnmanagedMemoryStream

我需要经常将数据从 C++ 传递到 C#。它应该尽可能快,因为我正在编写超低延迟交易应用程序。

我有纯C++项目(稍后会移植到Linux)。我需要将数据从它传递到我的 C# 项目。我总是需要传递相同的结构(如果这很重要)。

结构如下: Ticker = "MSFT" Price = "30" Volume = "10" Side = "Buy"

我想有两种选择:

  • 编写 C++-CLI 包装器,它将 UnmanagedMemoryStream 从 C++ 传递到 C#
  • 使用内存映射文件

会是什么:

  • 快点
  • 更容易实施
  • 更容易移植到 Linux 吗?