delphistackdelphi-2010

What is a safe Maximum Stack Size or How to measure use of stack?


I have an app with a number of worker threads, one for each core. On a modern 8 core machine, I have 8 of these threads. My app loads many plugins, which also have their own worker threads. Because the app uses huge blocks of memory (photos, e.g. 200 MB) I have a memory fragmentation problem (32 bit app). The problem is that every thread allocates the {$MAXSTACKSIZE ...} of address space. It's not using the physical memory but the address space. I reduced the MAXSTACKSIZE from 1 MB to 128 KB, and it seems to work, but I don't know if I'm near to the limit. Is there any possibility to measure how much stack is really used?


Solution

  • Use this to compute the amount of memory committed for the current thread's stack:

    function CommittedStackSize: Cardinal;
    asm
      mov eax,[fs:$4] // base of the stack, from the Thread Environment Block (TEB)
      mov edx,[fs:$8] // address of lowest committed stack page
                      // this gets lower as you use more stack
      sub eax,edx
    end;
    

    Another idea I don't have.