草庐IT

c++ - Windows 堆分配调用堆栈 - 奇怪的调用堆栈

我正在尝试分析托管进程内存转储,怀疑是否存在native内存泄漏。为了能够使用windbg(并从那里使用!heap扩展),我为服务器进程激活了用户模式调用堆栈我看到很多大小为68的block。在这些block中(我可以使用!heap-p-a手动验证的block)有许多调用堆栈的形式!heap-p-a000000003ca5cfd0address000000003ca5cfd0foundin_HEAP@1ea0000HEAP_ENTRYSizePrevFlagsUserPtrUserSize-state000000003ca5cfa000090000[00]000000003ca5cfd

c# - 在结构中编码(marshal) IntPtr[] 会导致 midiStream 函数出现错误,但将数组展开到一堆字段是可行的

我正在尝试使用C#中的Windows多媒体MIDI函数。具体来说:MMRESULTmidiOutPrepareHeader(HMIDIOUThmo,LPMIDIHDRlpMidiOutHdr,UINTcbMidiOutHdr);MMRESULTmidiOutUnprepareHeader(HMIDIOUThmo,LPMIDIHDRlpMidiOutHdr,UINTcbMidiOutHdr);MMRESULTmidiStreamOut(HMIDISTRMhMidiStream,LPMIDIHDRlpMidiHdr,UINTcbMidiHdr);MMRESULTmidiStreamRest

c# - 调试后台服务上的堆栈溢出错误

这不是一个真正的问题,而是一个希望对其他人有所帮助的答案。那些以前编写过Windows服务的人都知道找到其中的错误是一项多么艰巨的任务,尤其是当它只发生在实时环境中时。在我的例子中,我有一个平稳运行几个小时的服务,然后由于堆栈溢出错误而崩溃。没有堆栈跟踪。祝您大海捞针。该服务确实生成了一个日志文件,代码中充斥着日志条目,但尽管如此详细,它还是生成了500MB的日志文件!你几乎无法打开文件,更不用说分析它了。但是你如何解决这个问题呢?您可以尝试生成包含较少信息的日志文件,或者在写入新日志条目时自动删除旧日志条目的日志文件,但这样您就失去了错误的重要上下文。解决方案是一个日志文件,它会跟踪

c# - 大对象堆友好的 IDictionary

我们有一个应用程序在多个Dictionary中保存大量对象,其中一些对象在应用程序的生命周期中不断增长(交易应用程序有很多工具和不断增长的订单/交易).由于大型对象堆的碎片,我们遇到了OutOfMemoryException问题。为了解决这个问题,我尝试编写一个“大”字典,它实现为一个二级字典,其中所有叶字典都不够大,无法在LOH上分配。我使用了一致的哈希算法来避免在单个桶变得太大时不得不重新哈希整个字典。一致性哈希“圆”是来自C5集合库的TreeDictionary。我的问题是,是否有更好的C#数据结构(或者可能是我描述的更好的实现)?更新这是“大”字典的实现:https://gis

c# - 来自队列的大对象堆和字符串对象

我有一个Windows控制台应用程序,它应该可以运行数天和数月而无需重新启动。该应用程序从MSMQ检索“工作”并对其进行处理。有30个线程同时处理一个工作block。来自MSMQ的每个工作block大约为200kb,其中大部分分配在单个String对象中。我注意到,在处理了大约3-4千个这些工作block之后,应用程序的内存消耗高得离谱,消耗了1-1.5GB的内存。我通过探查器运行该应用程序,并注意到大部分内存(可能是gig左右)在大型对象堆中未使用,但结构是碎片化的。我发现这些未使用(垃圾收集)字节中有90%是以前分配的String。然后我开始怀疑来自MSMQ的字符串被分配、使用然后

c# - 高频堆

谁能给我解释一下CLR的“HighFrequencyHeap”? 最佳答案 高频堆用于存放常用的内部数据结构,如类型的方法表。这可以使用WinDbg/SOS进行验证,如下所示。SSCLIbook中也有说明(第235页)。这是!eeheap的部分输出--------------------------------------Domain1:006428c0LowFrequencyHeap:00340000(2000:2000)Size:0x2000(8192)bytes.HighFrequencyHeap:00342000(8000:

C# 增加堆大小 - 是否可能

我在读取大量文件时使用C#出现内存不足异常我需要更改代码,但目前我可以增加堆大小(就像我在Java中那样)作为短期修复吗? 最佳答案 .Net会自动执行此操作。看起来您已经达到了一个.Net进程可以用于其对象的内存限制(在32位机器上,这是2标准或3GB,通过使用/3GB启动开关。Leppie和EricLippert的信息致谢).重新考虑您的算法,或者更改为64位机器可能会有所帮助。 关于C#增加堆大小-是否可能,我们在StackOverflow上找到一个类似的问题:

c# - 在 Xamarin 中绑定(bind) .jar 时出现 Java 堆空间 OutOfMemoryError

按照Xamarin网站上的步骤进行BindingaJavaLibrary时为ArcGISforAndroid10.2.2创建绑定(bind)项目我能够编译项目。但是,当我尝试部署和运行该项目时,出现以下错误:COMPILETODALVIK:UNEXPECTEDTOP-LEVELerror:java.lang.OutOfMemoryError:Javaheapspaceatjava.util.Arrays.copyOf(Arrays.java:2760)atjava.util.Arrays.copyOf(Arrays.java:2734)atjava.util.ArrayList.ens

c# - 确定堆上对象的对象分配发生的位置

是否有任何工具可以从正在运行的应用程序中获取堆转储,并根据对象在源代码中的创建位置确定/分组对象?无需更改源代码,最好是免费的。 最佳答案 例如,来自ANTS的.NETMemoryProfiler怎么样。也许是CLRProfiler。 关于c#-确定堆上对象的对象分配发生的位置,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6428299/

c# 结构/类堆栈/堆控制?

所以在C++中这很容易。你想在堆上分配任何类/结构,使用新的。如果你想把它放在堆栈上,不要使用new。在C#中,我们总是使用new关键字,并且根据它是结构还是类,它被分配到堆栈或堆上(结构进入堆栈,类进入堆)——在某些应用程序中更改设计时可能会产生巨大的性能差异,这样只有那些对象才会进入真正属于那里的堆。我想知道的是-有没有一种直接的方法来控制对象的分配位置,而不管它是声明为结构还是类?我知道值类型(结构)可以装箱以进入堆(但装箱/拆箱会以性能成本为代价)。有没有办法在堆栈上分配类?此外,是否有任何机制可以分配原始内存并使用C++中的placementnew之类的东西?我知道这打破了被