回到 Java 世界,我能够指定 JVM 应该在第一个 OutOfMemoryError 上创建一个堆转储文件。C#中有什么等价的吗?
堆转储将是理想的,但我会满足于直方图。
如果无法自动执行此操作,是否有办法挂钩此异常,然后手动遍历堆?
回到 Java 世界,我能够指定 JVM 应该在第一个 OutOfMemoryError 上创建一个堆转储文件。C#中有什么等价的吗?
堆转储将是理想的,但我会满足于直方图。
如果无法自动执行此操作,是否有办法挂钩此异常,然后手动遍历堆?
您可以使用 MS 调试工具 ADPlus 实用程序来获取包含所有堆的进程转储。然后使用 WinDBG.exe(也在调试工具中),您可以使用 !DumpHeap 命令获取您需要的所有数据。
我会使用procdump,因为您可以在崩溃之前轻松设置它,以便在崩溃发生时转储内存。然后使用windbg查看内存。
我要补充一点,如果内存的去向不是很明显(使用 sos.dll 工具命令!dumpheap -stat),那么您可以使用 procdump 以特定的时间间隔进行一些故障转储,以便您可以跟踪哪些内存在成长。
如果你不熟悉 windbg 和 sos,你可能想看看这个。