Best Practice for Forcing Garbage Collection in C#

前端 未结 15 1817
天命终不由人
天命终不由人 2020-11-22 12:28

In my experience it seems that most people will tell you that it is unwise to force a garbage collection but in some cases where you are working with large objects that don\

相关标签:
15条回答
  • 2020-11-22 12:31

    Look at it this way - is it more efficient to throw out the kitchen garbage when the garbage can is at 10% or let it fill up before taking it out?

    By not letting it fill up, you are wasting your time walking to and from the garbage bin outside. This analogous to what happens when the GC thread runs - all the managed threads are suspended while it is running. And If I am not mistaken, the GC thread can be shared among multiple AppDomains, so garbage collection affects all of them.

    Of course, you might encounter a situation where you won't be adding anything to the garbage can anytime soon - say, if you're going to take a vacation. Then, it would be a good idea to throw out the trash before going out.

    This MIGHT be one time that forcing a GC can help - if your program idles, the memory in use is not garbage-collected because there are no allocations.

    0 讨论(0)
  • 2020-11-22 12:31

    The best practise is to not force a garbage collection in most cases. (Every system I have worked on that had forced garbage collections, had underlining problems that if solved would have removed the need to forced the garbage collection, and sped the system up greatly.)

    There are a few cases when you know more about memory usage then the garbage collector does. This is unlikely to be true in a multi user application, or a service that is responding to more then one request at a time.

    However in some batch type processing you do know more then the GC. E.g. consider an application that.

    • Is given a list of file names on the command line
    • Processes a single file then write the result out to a results file.
    • While processing the file, creates a lot of interlinked objects that can not be collected until the processing of the file have complete (e.g. a parse tree)
    • Does not keep much state between the files it has processed.

    You may be able to make a case (after careful) testing that you should force a full garbage collection after you have process each file.

    Another cases is a service that wakes up every few minutes to process some items, and does not keep any state while it’s asleep. Then forcing a full collection just before going to sleep may be worthwhile.

    The only time I would consider forcing a collection is when I know that a lot of object had been created recently and very few objects are currently referenced.

    I would rather have a garbage collection API when I could give it hints about this type of thing without having to force a GC my self.

    See also "Rico Mariani's Performance Tidbits"

    0 讨论(0)
  • 2020-11-22 12:31

    I think you already listed the best practice and that is NOT to use it unless REALLY necessary. I would strongly recommend looking at your code in more detail, using profiling tools potentially if needed to answer these questions first.

    1. Do you have something in your code that is declaring items at a larger scope than needed
    2. Is the memory usage really too high
    3. Compare performance before and after using GC.Collect() to see if it really helps.
    0 讨论(0)
  • 2020-11-22 12:36

    There are few general guidelines in programming that are absolute. Half the time, when somebody says 'you're doing it wrong', they're just spouting a certain amount of dogma. In C, it used to be fear of things like self-modifying code or threads, in GC languages it is forcing the GC or alternatively preventing the GC from running.

    As is the case with most guidelines and good rules of thumb (and good design practices), there are rare occasions where it does make sense to work around the established norm. You do have to be very sure you understand the case, that your case really requires the abrogation of common practice, and that you understand the risks and side-effects you can cause. But there are such cases.

    Programming problems are widely varied and require a flexible approach. I have seen cases where it makes sense to block GC in garbage collected languages and places where it makes sense to trigger it rather than waiting for it to occur naturally. 95% of the time, either of these would be a signpost of not having approached the problem right. But 1 time in 20, there probably is a valid case to be made for it.

    0 讨论(0)
  • 2020-11-22 12:36

    I've learned to not try to outsmart the garbage collection. With that said, I just stick to using using keyword when dealing with unmanaged resources like file I/O or database connections.

    0 讨论(0)
  • 2020-11-22 12:37

    I think the example given by Rico Mariani was good: it may be appropriate to trigger a GC if there is a significant change in the application's state. For example, in a document editor it may be OK to trigger a GC when a document is closed.

    0 讨论(0)
提交回复
热议问题