Each App Pool can use up to 2GB of private address space, unless you've played with BCDEDIT options like 3GB.
If all 10 used all 2GB possible, you'd be in paging hell.
Your question is more generally around how processes can allocate memory on Windows - I'll throw some terminology at you for further research.
Private bytes - this is the amount of memory uniquely charged to the process
Virtual bytes - this is the total amount of memory the process has allocated
Working Set - this is how much RAM is actually being used by the process
Reserved memory - memory that's earmarked for use by an application, but doesn't actually have RAM/pagefile backing yet
Committed memory - memory with backing
Now, the question becomes more complicated when you add app frameworks like .Net in - .Net has a lower-than-2GB workable maximum before OutOfMemoryExceptions happen. And generally, in my experience, they won't happen on an application that isn't either leaking something or under greater load than it can handle.
Perfmon with the process counters is typically all you can do with App Pools; you can enable the option to put the PID in the process name, if that helps, and APPCMD LIST WP regularly to keep a note of which app pool is doing what.