Re: StringBuilder Extension: IsQuotedBy
Barry Kelly <[email protected]> Thu, 14 Feb 2008 15:36:40 +0000
| Newsgroups | gmane.comp.windows.devel.dotnet.clr |
|---|---|
| Message-ID | <[email protected]> |
Sébastien Lorion <[email protected]> wrote: > Creating lots of short lived objects in a short time provoke many Gen1 > which artificially promotes other objects to Gen2 or Gen3. You then > get what Rico Mariani calls a mid-life crisis. You have your gen indexes shifted up by one :) Creating lots of *short-lived* objects is not usually a problem (ideally you'll be doing actual work, not just allocating), as long as you don't push gen1 objects into gen2. Gen1 should ideally only hold objects that couldn't be collected while collecting gen0 simply because they're currently in use, but will have died by the time a gen1 collection comes around. Thus, unless you're (ab)using gen1 by virtue of keeping a bunch of stuff around while doing all this allocation, the cheap creation stays cheap. In a bit more detail: if you have a call stack that, when simplified, looks like this: ProcessRequest() { stuff = MakeBigObjectGraph(); loop (lots_of_times) { MakeAndDiscardShortLivedObjects(); } LengthyProcessing(); // more likely problem Process(stuff); // discard stuff } ... then you may be in a bit of trouble, if the usage characteristics of MyRootMethod don't give the GC a chance to tune gen1 size to be bigger than the size of the thing returned by MakeBigObjectGraph + (lots_of_times / gen0_collection_rate_in_loop_iters) * average_objects_size_in_use_in_loop_body. Given that most .NET code runs on servers, and most servers have a predictable request/response pattern, the GC should be able to tune gen1 size appropriately. But measure, of course - both time in GC and with profiler / windbg to check that wrong objects aren't being promoted and that gen1 size is as expected. The above breaks down if the ideal gen1 size would be "too big" (a different problem - gen1 gets expensive, instead of gen2, and would probably need redesiging the code) - i.e. MakeBigObjectGraph is too large, or other processing code takes too much time. But hopefully it can be seen here that the problem is keeping "stuff" alive too long (in real time) or making it too big, not the number of short-lived objects. If the objects truly are short-lived, collecting gen0 should deallocate it almost completely every time (i.e. promote almost nothing to gen1), thus making a gen1 collection quite rare, and therefore mid-life crisis very rare. LengthyProcessing() is more likely a source of problems, preventing the collection of "stuff". > http://blogs.msdn.com/ricom/archive/2003/12/04/41281.aspx -- Barry -- http://barrkel.blogspot.com/ =================================== This list is hosted by DevelopMentor® http://www.develop.com View archives and manage your subscription(s) at http://discuss.develop.com