In a sequential program, there is only one run-time stack and all function calls, arguments, local variables/objects are allocated in a nested fashion on the same run-time stack,
In a multithreaded application, each “thread” gets a separate run-time stack.
In a sequential program, the main run-time stack is allocated at program start and all procedure
calls, including the initial call to “main” are made on this single run-time stack. If the main procedure creates a new thread, then a new run-time stack is dynamically allocated from the heap and all function calls, arguments, local variables/objects from the run method of the thread are allocated on this new stack. The first element on any thread's stack is the run() method.
So, the thread stack needs to be large enough to hold the maximum number of bytes required to hold all function calls, arguments, local variables/objects allocated on the stack. Generally in Operating systems stack allocation is typically set at 1MB, consisting of contiguous virtual memory pages, that are allocated incrementally at run-time by the system
In a stack, extra memory pages allocated “above” the top and “below” the bottom of the stack to detect overﬂow OR underﬂow (underﬂow stack frame raises exception if empty stack is “popped” - overflow raises exception when Stack is full and still items are being pushed).