none
关于.net 4.6 preview新增的GC.Collect函数的重载的一点疑问。 RRS feed

  • 问题

  • 该重载详见https://msdn.microsoft.com/en-us/library/dn906200(v=vs.110).aspx

    关键是最后增加了一个bool类型的参数,用于表明是否压缩小对象堆。在以前,只要调用了GC.Collect或者在其他情况下发生了GC,一定会压缩小对象堆,但这个函数却允许垃圾回收但不压缩小对象堆,这会造成小对象堆出现碎片,那这种垃圾回收有何意义呢?除非下次分配对象时允许在大小合适的碎片上分配,但这样一来,.net引以为豪的快速分配特性可能会不复存在,因为分配时也要像C++一样与每个碎片比较大小,拖慢了分配速度。不知道微软这样设计有何考虑?如果允许手动GC时选择不压缩小对象堆,那么CLR自动调用GC时是否也可能会在某些特定情况下选择不压缩小对象堆的模式?

    2015年3月7日 8:01

答案

  • 据我所知对象的清理和内存的压缩并不是同时进行的,而且托管堆内存的完全压缩执行的频率比较低,大部分情况下只会对较新的内存空间进行部分压缩。

    这个涉及到GC内部的内存压缩算法和内存分配算法问题,我这里了解的不是太深入。推荐你看一些这方面的书籍或者文档来了解更详细的内容,以下链接可能对你有所帮助:

    Garbage Collector Basics and Performance Hints

    Back To Basics: Mark and Sweep Garbage Collection

    以及一本书,名为《Garbage Collection: Algorithms for Automatic Dynamic Memory Management》。

    个人觉得并没有必要太深入的研究GC,因为GC的目的是将程序员从内存管理里面解放出来,专注于程序设计。而且在.Net编程中应该尽量避免手动调用GC的方法,除非在一些比如性能调试之类的特殊场景。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.


    2015年3月10日 7:01
    版主

全部回复

  • 我猜测这个重载只是给程序员提供了多一种选择,当前一轮的垃圾回收不进行小对象堆的压缩可以节省一部分时间。我没有查到相关资料,但是你说的不进行压缩就“拖慢了分配速度”这个说法值得研究一下,并不一定是像c++一样需要比较碎片大小然后再分配,有可能是在堆的最顶端分配新对象的内存。

    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年3月9日 9:53
    版主
  • 我猜测这个重载只是给程序员提供了多一种选择,当前一轮的垃圾回收不进行小对象堆的压缩可以节省一部分时间。我没有查到相关资料,但是你说的不进行压缩就“拖慢了分配速度”这个说法值得研究一下,并不一定是像c++一样需要比较碎片大小然后再分配,有可能是在堆的最顶端分配新对象的内存。

    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    如果仍然在堆的最顶端分配新对象的内存,那么本次不压缩小对象堆的垃圾回收也就毫无意义了,还不如不回收,更省时间。
    2015年3月9日 11:33
  • 据我所知对象的清理和内存的压缩并不是同时进行的,而且托管堆内存的完全压缩执行的频率比较低,大部分情况下只会对较新的内存空间进行部分压缩。

    这个涉及到GC内部的内存压缩算法和内存分配算法问题,我这里了解的不是太深入。推荐你看一些这方面的书籍或者文档来了解更详细的内容,以下链接可能对你有所帮助:

    Garbage Collector Basics and Performance Hints

    Back To Basics: Mark and Sweep Garbage Collection

    以及一本书,名为《Garbage Collection: Algorithms for Automatic Dynamic Memory Management》。

    个人觉得并没有必要太深入的研究GC,因为GC的目的是将程序员从内存管理里面解放出来,专注于程序设计。而且在.Net编程中应该尽量避免手动调用GC的方法,除非在一些比如性能调试之类的特殊场景。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.


    2015年3月10日 7:01
    版主