Also we should throw in the fact that due to the unity engine they used as I found out, they are limited in heap size to well I don't remember exactly, I think it was 500 MB, and that heap is what runs out in large games. And 500 MB is a lot easier to hit then 4 GB, if they were a proper 32 bit executable running on windows x64. They don't have the large address aware flag set, so they are limited to only 2GB, should be more then enough if it was not for Unity's own design issues. 2GB is a lot of data, and it not as easy as you think to fill it up with things that are not textures, video or extremely baddy handled music. Provided you do proper garbage collection that is.
Couple of notes:
1. It's about 800-900 MB of heap space that we get before unity cracks up. That's referring to the mono runtime and just things like strings, game data structures, etc.
2. Unmanaged memory in unity actually does use the large address space extensions, and so can address 3GB+ depending on your OS. That's where all the graphics, sound, music, and so on go. That part is nowhere near problematic on most machines, unless you simply have very little RAM and also don't have swap space set up so that windows can shuffle it's own RAM usage into the background while you play.
3. For a superlarge game of AI War with lots of data structures, more RAM indeed would not help, as you say. Unity would have to increase the effective max heap size in mono. A simple doubling of it would work wonders, because there's a certain heap overhead that is always used (about 200MB), and then the rest is just whatever is used by the game at the time.
4. However, even more to the point, unity could just solve most of our problems by making the GC not suicidal. It's almost never the case that we try to use more heap than is allowed in terms of permanent allocations. The problem is that when unity tries to allocate more than the allowed amount of heap, its response is not to do a GC collection and then allocate -- it's response is to crash. Which is, of course, insane. It has the RAM right there and free, if only it would do a GC collection before the allocation occurs. So instead of unity seamlessly handling that, we basically have to run interference on the GC and do manual collections when we see that the transient allocation is high enough and we're about to do something that requests a big block of transient memory.