第1代垃圾收集率很高

时间:2012-03-07 06:30:25

标签: asp.net .net performance visual-studio-2010

我正在分析在生产中表现不佳的应用程序(使用VS 2010)。 VS 2010提出的建议之一是:

  

第1代垃圾收集的比率相对较高。如果,通过   设计中,大多数程序的数据结构都是分配的   坚持了很长时间,这通常不是问题。然而,   如果此行为是无意的,您的应用可能会固定对象。如果   你不确定,你可以收集.NET内存分配数据和   对象生命周期信息,以了解内存的模式   分配您的应用程序使用。

在Google上搜索会显示以下链接=> http://msdn.microsoft.com/en-us/library/ee815714.aspx。我是否可以做一些明显的事情来减少这个问题?我似乎迷失在这里。

  

双击“错误列表”窗口中的消息以导航到   标记分析数据的视图。找到Gen 0的.NET CLR Memory#   收集和.NET CLR内存#Gen 1集合列。   确定程序执行的具体阶段是否存在   垃圾收集更频繁发生。比较这些值   到GC列中的%Time,看是否有托管内存的模式   分配导致过多的内存管理开销。

     

要了解应用程序的托管内存使用模式,   配置文件再次运行.NET内存分配配置文件和请求   对象生命周期测量。

     

有关如何提高垃圾收集性能的信息,   请参阅Microsoft上的垃圾收集器基础知识和性能提示   网站。有关自动垃圾开销的信息   集合,请参见大对象堆未覆盖。

1 个答案:

答案 0 :(得分:1)

相关的一行是:

  

要了解应用程序的托管内存使用模式,请再次运行.NET内存分配配置文件并请求对象生命周期测量。

您需要了解应用程序分配了多少对象,以及它们活动的时间和持续时间。您可能在某个循环内部分配了数百(或数千!)个微小对象,而没有真正考虑当引用超出范围时回收该内存的后果。

http://msdn.microsoft.com/en-us/library/ms973837.aspx州:

  

现在我们已经有了一个基本模型来说明事情是如何运作的那样   考虑一些可能会导致速度变慢的问题。那   会让我们知道我们应该尽量避免哪些事情   从收藏家那里获得最佳表现。

     

分配太多

     

这确实是最基本的问题。分配新的   垃圾收集器的内存真的非常快。如你看到的   在上面的图2中,所有需要发生的事情通常都是为了   要移动的分配指针,以便为新对象创建空间   “分配”方面 - 它没有比这快得多。然而,   垃圾收集迟早会发生,一切都在发生   相等,这比晚更快发生更好。所以你要   确保在创建新对象时确实如此   这样做是必要和适当的,即使只创造一个也是如此   快。

     

这可能听起来像是明显的建议,但实际上它非常容易   忘记你写的一小段代码可能会引发很多   分配。例如,假设您正在编写比较   某种功能,并假设您的对象有关键字   字段,并希望您的比较不区分大小写   给定顺序中的关键字。现在在这种情况下你不能只是比较   整个关键字字符串,因为第一个关键字可能非常   短。使用String.Split来破解关键字是很诱人的   把它串成碎片,然后按顺序比较每一块   正常的不区分大小写的比较。听起来不错吧?

     

好吧,事实证明这样做并不是一个好主意。您   看,String.Split将创建一个字符串数组,这意味着   最初在关键字中的每个关键字的一个新字符串对象   字符串再加上一个数组对象。哎呀!如果我们这样做   在某种情况下,这是很多比较和你的   现在两行比较功能创造了非常多的功能   临时对象。突然间垃圾收集器将会是   代表你努力工作,甚至是最聪明的人   收集计划只有很多垃圾清理。更好   编写一个不需要分配的比较函数   所有