.NET内存探查器优化收益在生产中消失

.NET内存探查器优化收益在生产中消失,.net,garbage-collection,profiling,.net,Garbage Collection,Profiling,我一直在使用内存分析器(.NET memory profiler from Scitech),仔细地检查各种代码位,并改进程序的垃圾生成特性。计数器显示垃圾收集已大大减少 至少看起来是这样。因为当我在剖析器之外运行程序时,GCs似乎和所有这些优化之前一样频繁发生!我已经做了一些琐碎的检查(它是相同的程序,编译选项相同,机器/用途相同,输入都相同),我想知道是否有一些关于探查器如何运行的事情我没有被告知。当然,探查器必须在程序中的某个位置放置钩子,以查看显示的所有信息。但如果没有这些挂钩,你肯定会

我一直在使用内存分析器(.NET memory profiler from Scitech),仔细地检查各种代码位,并改进程序的垃圾生成特性。计数器显示垃圾收集已大大减少

至少看起来是这样。因为当我在剖析器之外运行程序时,GCs似乎和所有这些优化之前一样频繁发生!我已经做了一些琐碎的检查(它是相同的程序,编译选项相同,机器/用途相同,输入都相同),我想知道是否有一些关于探查器如何运行的事情我没有被告知。当然,探查器必须在程序中的某个位置放置钩子,以查看显示的所有信息。但如果没有这些挂钩,你肯定会认为事情会更顺利,而不是更少

以前有人见过这样的吗

编辑


我意识到,当这个问题似乎不具体时,很难找到答案。只是想知道是否有足够多的眼球会导致出现有用的提示。

如果您的生产版本在内存较少的计算机上运行,您将更频繁地达到垃圾收集阈值,从而强制执行更多GC


.NET程序的内存越大,其内存就越大,通常开发机器的资源要比最终用户运行程序的机器好得多(这很好,也可以理解,但您需要记住).

如果您的生产版本在内存较少的计算机上运行,您将更频繁地达到垃圾收集阈值,从而强制执行更多GC


.NET程序的内存越大,其内存就越大。通常,开发机器的资源要比最终用户运行程序的机器好得多(这很好,可以理解,但你需要记住)。

你好吗“改进(my)程序的垃圾生成特性“?好吧,我从SciTech网站上提供的视频教程中吸取了一些教训。基本上是使用程序中提供的各种计数器进行侦查工作。关于什么可能导致内存问题,也有很多提示,我解决了我能找到的问题。但是有问题吗?你的应用程序是否受到过多GC的影响?频率是基于时间的。内存分析器可以大大降低程序的运行速度。在没有附加调试程序的情况下运行的发行版GC非常非常擅长它的功能。我有一个应用程序,我做了很多工作来减少分配量(从2.5 GiB降低到只有100 MiB——它使用了一些非常低效的第三方解析库)。在调试模式和调试器中,更改非常重要。在没有调试器的发布模式中,几乎没有任何真正的区别。在我的实践中,我认为只有在内存中有固定指针时,才应该真正关心GCs。如果不让GC做它的工作,它在这方面出人意料地出色。你是如何“改进(我的)程序的垃圾生成特性”的?好吧,我从SciTech网站上提供的视频教程中吸取了一些教训。基本上是使用程序中提供的各种计数器进行侦查工作。关于什么可能导致内存问题,也有很多提示,我解决了我能找到的问题。但是有问题吗?你的应用程序是否受到过多GC的影响?频率是基于时间的。内存分析器可以大大降低程序的运行速度。在没有附加调试程序的情况下运行的发行版GC非常非常擅长它的功能。我有一个应用程序,我做了很多工作来减少分配量(从2.5 GiB降低到只有100 MiB——它使用了一些非常低效的第三方解析库)。在调试模式和调试器中,更改非常重要。在没有调试器的发布模式中,几乎没有任何真正的区别。在我的实践中,我认为只有在内存中有固定指针时,才应该真正关心GCs。如果不是——让GC来完成它的工作,它会出人意料地出色。啊,我应该补充一点,代码是在与产品相同的机器上、相同的用户上分析的。垃圾收集与RAM的安装量无关。不,但垃圾收集率会。除非您达到开始收集垃圾的阈值,否则运行时将让“死”对象堆积。@Blindy虽然这是真的,但您不应该忘记在GC运行之前内存分配有限制(在运行时统计确定)。默认值按单个MIB的顺序排列,因此它们实际上与可用的总RAM没有任何关系-只有当您一次实际需要那么多RAM时,这才成为一个问题。如果您继续分配和取消分配,几乎不存在对可用RAM的任何依赖。啊,我应该补充一点,代码是在与产品相同的机器、相同的用户上分析的。垃圾回收与RAM的安装量无关。不,但垃圾回收率与此无关。除非您达到开始收集垃圾的阈值,否则运行时将让“死”对象堆积。@Blindy虽然这是真的,但您不应该忘记在GC运行之前内存分配有限制(在运行时统计确定)。默认值按单个MIB的顺序排列,因此它们实际上与可用的总RAM没有任何关系-只有当您一次实际需要那么多RAM时,这才成为一个问题。如果您继续分配和取消分配,就几乎不存在对可用RAM的任何依赖。