I'm trying to cut down on the process memory usage for a non-relational database i'm working on.  essentially there are 10,000 processes (setup as gen_servers) that send information to each other in various ways.  i have several questions:<br>
<ol><li>how much of an overhead does using the gen_server model assert?  if i'm not as worried about dynamic code loading, supervising, etc... am i wasting memory and processing using the gen_server?</li><li>how/where can i find out more information about the memory usage of a process?  i've used process_info/2 heavily to gather some of this information, but my problem is that if i look at the rough size of the state of a process (using erlang:iolist_size/1), it's significantly less than the size of the process as reported by process_info/2.  i want to know where the rest of the memory is being eaten up (initially the processes are only 1k), on average, the process size is about 4x the state size. </li>
<li>i am passing around many closures between the nodes of the database, and they are getting to be quite large (start out as 100bytes, end up as 40kbytes).  these are what is taking up most of the memory of the state, and so i'm wondering if there is some inner workings of the erlang system that make this a bad way of programming in terms of memory usage.  it seems like there are certain situations that make closures take up a lot of memory, but i'm having trouble pinpointing when.  <br>
</li><li>is there a good tool out there for profiling the memory usage rather than executiontime usage?</li></ol>thanks for the help,<br>-matt handler<br>