- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。
想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。
3年前关闭。
Improve this question
我尝试过的大多数 .NET 内存分析器都允许您拍摄内存快照。
但是,我正在尝试诊断一个问题,即我最终分配给 .NET 的大量内存被 ANTS 分析器指示为“空闲”。 (我已经用 Mem Profiler 和 CLR Profiler 等其他分析器确认了这个问题。
ANTS 显示我有大量内存碎片(100% 的空闲内存,最大块为 150MB。)堆中所有对象的总大小为 180MB。我有 553 MB 分配给 .NET,152 MB 分配给“非托管”。
但是,大对象堆 (LOH) 的大小仅为 175kb。这是在那里分配的对象的实际大小。我不会分配任何最终在 LOH 上永久的对象。
因此,我的问题,在某些方面,我怀疑我正在以某种方式分配大对象(超过 LOH 的 85k 限制),然后处理它们。
我正在从数据库(Oracle、Sql Server)中读取大量数据(这里估计有几 MB),将这些数据复制到内存中的对象数组,并将数据处理成索引(数组、字典等)以便于搜索/过滤/处理。
我的猜测是,数据读取器暂时分配了大量空间。但是,我没有很好的方法来暂停程序并拍摄内存快照。
我想要的是一个分析器,它可以跟踪 LOH 上分配的每个对象 所以我可以弄清楚是什么导致了 LOH 碎片和过多的内存使用(内存没有返回给操作系统,所以看起来我的进程正在占用 1GB 的内存来存储 200MB 的分配对象。)我猜是内存没有返回,因为 LOH 没有被压缩,所以我在我的进程的生命周期中被所有这些内存困住了,这可能是数周(它作为 Windows 服务运行。)
编辑:我的问题是我的 .NET 应用程序使用了大量我无法追踪的内存。
Edit1:我使用了 Visual Studio 内存分析器。虽然它确实告诉我实例化的所有对象、多少、总字节数等,但我没有提示我为什么最终有这么多空闲内存。我唯一的提示/线索是 ANTS 告诉我的:“内存碎片正在限制可以分配的对象的大小。”我有很多未使用的内存分配给 .NET 没有使用。
Edit2:更多分析表明我在 LOH 上分配了一些短期存在的大对象。但是,在 LOH 上分配的总量永远不会超过 3 到 4 MB。然而,在这段时间里,私有(private)字节通过屋顶,翻了一番,翻了三番,而我实际分配的对象(在所有堆上)的大小只略有增加。例如,所有堆中的字节为 115MB,但我的私有(private)字节超过 512 MB。
ANTS 清楚地告诉我,我遇到了内存碎片问题。结果我在 LOH 上创建了短暂的对象。但是,这些对象的总大小不会超过 3 或 4 MB。所以这些短命的大物体(似乎?)正在 split LOH。
回应 Eric Lippert 和迪士尼乐园 parking 场的比喻(这很棒)。
这就像有人在一个地方 parking 几分钟,然后离开。然后保留该位置(没有其他人可以在那里 parking ),直到我重新铺设 parking 场!
当 Visual Studio 警告我内存使用情况并建议切换到 x64 时,我首先开始对此进行调查。 (我忘记了警告号码,快速谷歌没有找到)。因此,切换到 x64 可以缓解眼前的问题,但并没有解决根本问题。
就像我有一个可以停 1000 辆车的 parking 场,但是当我把 100 辆车放进去之后,我的 parking 服务员尖叫着说它已经满了......
幸运的是,我有一个庞大的 VMware 集群可供我使用,并且有一个懂行的管理员。我被分配了 8 个 cpu 和 8 GB 的内存。所以只要有问题,我可以处理,我只是投入资源。另外,(正如我上面所说的)我切换到 x64 一段时间,因为 Visual Studio 不断提醒我警告,但是,我想弄清楚它在 LOH 上分配的内容,看看我是否可以减轻这种堆碎片一些小的代码更改。也许是一个傻瓜的差事,因为我可以向它扔资源。
应用程序运行良好,速度很快,偶尔会出现 GC 暂停。但大多数情况下我可以忍受这种情况,我只想知道是什么物体导致了它。我的怀疑是一些我还没有找到的短期字典。
编辑3 :http://msdn.microsoft.com/en-us/magazine/cc188781.aspx
ObjectAllocatedByClass does not track allocations of the large object heap, but ObjectAllocated does. By comparing the notifications from the two, an enterprising soul should be able to figure out what is in the large object heap as opposed to the normal managed heap.
最佳答案
经过试验,我能够在 GC 从一代中删除事物时收到通知,但在将其放入时却无法收到通知。
由于 LOH 不是特定于世代的,并且没有我可以访问的特定事件以获取 LOH 插入的通知,因此我可以提供的唯一替代方法是调试应用程序,进行故障转储 - 或者 - 在本地运行它并使用 WinDBG。您可以这样做:
g
(去)load .sos
- 加载 .NET 扩展 !dumpheap -min 85000
- 这将列出应位于 LOH Address MT Size
0000000012a17048 000007fee7ae6ae8 400032
0000000012a78b00 000007fee7ae6ae8 400032
0000000012ada5b8 000007fee7ae6ae8 400032
0000000012b3c070 000007fee7ae6ae8 400032
0000000012b9db28 000007fee7ae6ae8 400032
!do <paste from clipboard>
CLR Version: 4.0.30319.261
SOS Version: 4.0.30319.239
Name: System.String
MethodTable: 000007fee7ae6ae8
EEClass: 000007fee766ed68
Size: 400026(0x61a9a) bytes
File: C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
String: 8470737076787475867884758166807183888774746571677189..
Fields:
MT Field Offset Type VT Attr Value Name
000007fee7aec9d0 4000103 8 System.Int32 1 instance 200000 m_stringLength
000007fee7aeb510 4000104 c System.Char 1 instance 38 m_firstChar
000007fee7ae6ae8 4000105 10 System.String 0 shared static Empty
>> Domain:Value 000000000055fe50:0000000002a11420 <<
Size: 400026(0x61a9a) bytes
String: 8470737076787475867884758166807183888774746571677189..
关于c# - 是否有一个 .Net 内存分析器可以跟踪大对象堆上的所有分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9911788/
有没有办法在 xdebug 跟踪输出中查看 echo 或 print 函数调用。我正在为我在我的服务器中运行的所有脚本寻找一个全局配置(或一种方法)。 例子: 我希望跟踪输出显示 echo 调用。默
我将应用程序从2.0.0M2升级到了2.1.0,但是当我尝试运行该应用程序时,出现此错误: Note: /Volumes/Info/proyectos-grails/vincoorbis/Member
我如何在共享点中执行日志记录。我想使用跟踪。 以便它记录 12 个配置单元日志。 最佳答案 微软提供了一个例子: http://msdn.microsoft.com/en-us/library/aa9
如何跟踪 eclipse 和 android 模拟器的输出。我习惯于在 Flash 和 actionscript 中这样做。 在 AS3 中它将是: trace('我的跟踪语句'); 最佳答案 您有几
是否可以在 Postgresql 上进行查询跟踪?我在带有 OLEDB 界面的 Windows 上使用 9.0。 此外,我需要它是实时的,而不是像默认情况下那样缓冲... 最佳答案 我假设您的意思是在
第一天 HaxeFlixel 编码器。愚蠢的错误,但谷歌没有帮助我。 如何使用 Haxe、NME 和 Flixel 追踪到 FlashDevelop 输出。它在使用 C++ 执行时有效,但对 Flas
我有一个关于 iPhone 上跟踪触摸的快速问题,我似乎无法就此得出结论,因此非常感谢任何建议/想法: 我希望能够跟踪和识别 iPhone 上的触摸,即。基本上每次触摸都有一个起始位置和当前/移动位置
我正在做我的大学项目,我只想跟踪错误及其信息。错误信息应该与用户源设备信息一起存储在数据库中(为了检测源设备,我正在使用MobileDetect扩展名)。我只想知道应该在哪里编写代码,以便获得所有错误
我正在 Azure 中使用多个资源,流程如下所示: 从 sftp 获取文件 使用 http 调用的数据丰富文件 将消息放入队列 处理消息 调用一些外部电话 传递数据 我们如何跟踪上述过程中特定“运行”
在我的 WCF 服务中,当尝试传输大数据时,我不断收到错误:底层连接已关闭:连接意外关闭 我想知道引发此错误的具体原因,因此我设置了 WCF 跟踪并可以读取 traces.svclog 文件。 问题是
我的目标是在 Firebase Analytics 中获取应用数据,在 Google Universal Analytics 中获取其他自定义数据和应用数据。 我的问题是我是否在我的应用上安装 Fir
我正在 Azure 中使用多个资源,流程如下所示: 从 sftp 获取文件 使用 http 调用的数据丰富文件 将消息放入队列 处理消息 调用一些外部电话 传递数据 我们如何跟踪上述过程中特定“运行”
我们正在考虑跟踪用户通过 Tridion 管理的网站的旅程的要求,然后能够根据此行为将此用户识别为“潜在客户”,然后如果他们在之后没有返回,则触发向此用户发送电子邮件X 天。 SmartTarget
在 Common Lisp 中,函数(跟踪名称)可用于查看有关函数调用的输出。 如果我的函数是用局部作用域声明的,我如何描述它以进行跟踪? 例如,如何跟踪栏,如下: (defun foo (x)
有什么方法可以检测文本框的值是否已更改,是用户明确更改还是某些 java 脚本代码修改了文本框?我需要检测这种变化。 最佳答案 要跟踪用户更改,您可以添加按键处理程序: $(selector).key
int Enable ( int pid) { int status; #if 1 { printf ( "child pid = %d \n", pid ); long ret =
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我有以下测试代码: #include int main(void) { fprintf(stderr, "This is a test.\n"); int ret = open("s
我有一个闭源 Java 应用程序,供应商已为其提供了用于自定义的 API。由于我没有其他文档,我完全依赖 API 的 javadoc。 我想跟踪特定用例在不同类中实际调用的方法。有什么办法可以用 ec
我正在学习 PHP。我在我的一个 php 函数中使用了如下所示的 for 循环。 $numbers = $data["data"]; for ($i = 0;$i send($numbers[
我是一名优秀的程序员,十分优秀!