Visual Studio 2017 - 诊断工具 - 堆分析影响程序内存消耗
Visual Studio 2017 - Diagostic tool - Heap profiling affects program memory consumption
我正在尝试使用诊断工具和内存使用情况快照调试 C# 应用程序(使用 c++/cli 和 c++)中的奇怪内存泄漏。但是我发现了一个奇怪的问题。
当我 运行 在启用堆分析的 VS2017 中进行调试时,内存消耗是恒定的并且按预期编程 运行s。当关闭堆分析时,程序泄漏的内存呈线性增加。完成的工作是相同的,我在控制台中打印了工作进度,我确信这两个程序都完成了相同的工作,但一个使用常量内存,另一个使用线性增加的内存(当完成相同的工作时使用 2 倍内存)。从视觉上看,当使用堆分析触发 GC 时,一些内存会被释放,而当不使用堆分析时,不会释放任何内存。
有谁知道堆分析如何影响这个?本机内存泄漏。
[EDIT1] 来自性能分析器的数据 -> 内存使用
Object Type Reference Count Module
shared_ptr_cli<GeoAtomAttributes> TestBackEnd64.dll
shared_ptr_cli<GeoAtomAttributes> [Finalization Handle] 856,275 TestBackEnd64.dll
shared_ptr_cli<GeoAtomAttributes> [Local Variable] 1 TestBackEnd64.dll
GeoAtomAttributesCli [Local Variable] 1 TestBackEnd64.dll
可以用gc释放的内存不应该被认为是泄漏内存,它应该被认为是符合垃圾回收条件的内存。因为下次执行 gc 时,将收集此内存并可用于新对象分配。
其他想法;
Gc 在托管堆上运行,本机库在本机堆上分配内存。所以它不会影响本地库的内存管理。但您应该注意以下情况。(虽然这可能不是您的情况)
如果你传递 pinned data structures to native code and free these handles on your Object.Finalize 方法(包装 class);在这种情况下,固定内存只能在包装器 class 排队等待托管 class 的 finalize 方法中的本机代码的 finalization.Calling 清理函数 (*) 时收集,也可能导致类似情况。我认为这些都是不好的做法,不应使用,而应尽快进行这些清理工作。
(*) 这种情况可能会导致您的总进程内存消耗膨胀,即使在托管堆中不需要 gc 也是如此。
我正在尝试使用诊断工具和内存使用情况快照调试 C# 应用程序(使用 c++/cli 和 c++)中的奇怪内存泄漏。但是我发现了一个奇怪的问题。
当我 运行 在启用堆分析的 VS2017 中进行调试时,内存消耗是恒定的并且按预期编程 运行s。当关闭堆分析时,程序泄漏的内存呈线性增加。完成的工作是相同的,我在控制台中打印了工作进度,我确信这两个程序都完成了相同的工作,但一个使用常量内存,另一个使用线性增加的内存(当完成相同的工作时使用 2 倍内存)。从视觉上看,当使用堆分析触发 GC 时,一些内存会被释放,而当不使用堆分析时,不会释放任何内存。
有谁知道堆分析如何影响这个?本机内存泄漏。
[EDIT1] 来自性能分析器的数据 -> 内存使用
Object Type Reference Count Module
shared_ptr_cli<GeoAtomAttributes> TestBackEnd64.dll
shared_ptr_cli<GeoAtomAttributes> [Finalization Handle] 856,275 TestBackEnd64.dll
shared_ptr_cli<GeoAtomAttributes> [Local Variable] 1 TestBackEnd64.dll
GeoAtomAttributesCli [Local Variable] 1 TestBackEnd64.dll
可以用gc释放的内存不应该被认为是泄漏内存,它应该被认为是符合垃圾回收条件的内存。因为下次执行 gc 时,将收集此内存并可用于新对象分配。
其他想法;
Gc 在托管堆上运行,本机库在本机堆上分配内存。所以它不会影响本地库的内存管理。但您应该注意以下情况。(虽然这可能不是您的情况)
如果你传递 pinned data structures to native code and free these handles on your Object.Finalize 方法(包装 class);在这种情况下,固定内存只能在包装器 class 排队等待托管 class 的 finalize 方法中的本机代码的 finalization.Calling 清理函数 (*) 时收集,也可能导致类似情况。我认为这些都是不好的做法,不应使用,而应尽快进行这些清理工作。
(*) 这种情况可能会导致您的总进程内存消耗膨胀,即使在托管堆中不需要 gc 也是如此。