问题标签 [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.
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 或两者的技术细节的答案。
c# - .net 4 应用程序池中的非托管内存
我正在尝试在 .net 4 应用程序中追踪一些非托管内存的来源
(这是好奇心……我没有什么大问题,我只是想知道它是什么)
我的应用程序当前包含 1 个文件:index.html - 包含“hello world”
从内存分析器中,我加载了 index.html 并且它消耗的很少(事实上,配置文件并没有启动 int)
然后我加载 /fish(它不存在),现在突然我们总共使用了大约 57MB,其中 54MB 是非托管内存。
对于一个空的应用程序来说,这似乎有很多内存 - 以及非托管内存中的内容
有一个 2.4MB 的“分配给 .NET 的未使用内存”,这是我完全预料到的。
奇怪的是,如果我将应用程序池切换到.net 2,内存不会以这种方式跳跃
正如我所说,我很好奇,但我在网上找不到任何关于它的信息。
.net - .net 内存管理的几个问题
我已经在 .net 中阅读了一些关于内存管理的想法,但是我没有回答以下三个问题
- 非托管资源在用于托管资源的同一托管堆中获取内存以及谁分配它(OS OR CLR 或其他任何东西)?
- 在托管资源 R 上调用 Dispose() 方法,将立即释放该 R 占用的内存以及 R 占用的所有其他非托管资源
- Who 清除被取消管理的资源(OS OR CLR 或其他)占用的内存。
欢迎任何帮助。
wpf - 高非托管内存 - WPF 应用程序
我即将部署我的新 WPF 应用程序,我刚刚在任务管理器中注意到它消耗了大量内存。因此,我下载了 RedGate Antz 的试用版,试图找出导致此问题的原因,我震惊地看到大约 90 MB 的非托管内存使用情况。因为 Antz 不支持未损坏的内存,所以我尝试使用 Windbg,它本身并没有指向高使用率。这让我相信它一定是我正在加载的 DLL 之一。我在我的应用程序中使用 DevExpress 控件。
一个有趣的功能是当我最小化我的应用程序时,内存从 110 MB 下降到大约 6-10 MB。
我应该担心/担心吗?
这是我的第一个 WPF 应用程序,我不完全确定在内存使用方面会发生什么。最小化此内存的事实是否会重新获得/放弃表明一切正常?
关于可能导致此问题的任何想法或想法将是最有帮助的。
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扩展内存的最佳方法是什么?对于这种情况,我将不胜感激任何指向一个好的设计解决方案的指针。
android - 通过java使用本机内存
有时,需要绕过应用程序的堆内存限制并使用超出允许范围的内存。
我想到了一个解决方案,其中包括一种缓存机制,它将字节存储在本机内存中(不是在堆内存中,而是在非托管内存中)。
当然,我会考虑系统的最大可用大小。
所以,对直接缓冲区有所了解,我用它在本机内存中存储了一个字节数组:
但是,似乎在 Android 上,用于此的内存是在堆中使用的,而不是在本机内存中使用的。
到底是怎么回事?是否有一种简单的替代方法可以从本机内存存储和加载数据?
.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 的本机代码配置阅读器)发狂的原因?
c# - 对内存位置的无效访问 - 托管到非托管代码
我在 c++ 中有这个代码,我通过 dll 导出:
我从 c# 调用 dll,这就是我在那里写的:
这是对 Init 的调用:
对于上述所有代码,当我运行 c# 应用程序时,有时会在 x64 机器中出现以下异常:
如何在不从编译中删除任何安全标志的情况下修复此代码?修复的代码示例真的很受欢迎!
谢谢!
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...)
c# - 将数据从 C++ 传递到 C# - 映射文件与 CLI+UnmanagedMemoryStream
我需要经常将数据从 C++ 传递到 C#。它应该尽可能快,因为我正在编写超低延迟交易应用程序。
我有纯C++项目(稍后会移植到Linux)。我需要将数据从它传递到我的 C# 项目。我总是需要传递相同的结构(如果这很重要)。
结构如下: Ticker = "MSFT" Price = "30" Volume = "10" Side = "Buy"
我想有两种选择:
- 编写 C++-CLI 包装器,它将 UnmanagedMemoryStream 从 C++ 传递到 C#
- 使用内存映射文件
会是什么:
- 快点
- 更容易实施
- 更容易移植到 Linux 吗?