If there is a linked list with 4M+ nodes, does the mark phase needs to traverse the entire list each time to build the graph? Are there any optimizations applied in this case? In the plain sight it doesn’t look efficient. Is there a way to verify if GC traverses the entire list or not?
TIA.
Yes, it will need to traverse the whole object graph. I can’t think how there could be any optimizations, to be honest… but it doesn’t need to do very much on each node. Most of the time will probably be spent waiting on memory, I suspect, as obviously it’ll burn through the cache. Of course, by the time the linked list ends up in gen2 (and if you’re allocating millions of nodes, most of it will be in gen2 pretty quickly), it will only need to do that very rarely.
If this is the most reasonable data structure for your app, I would use it for the moment, but keep track of the performance hit of garbage collection using Performance Monitor etc. If it turns out to be a problem, you can consider alternative strategies.