Stack memory helps your program keep track of what it is doing step-by-step. It stores information about method calls and local variables so your program can run smoothly.
Stack memory in Java
public class StackMemoryExample { public static void main(String[] args) { int number = 5; // stored in stack int result = factorial(number); // method call stored in stack System.out.println("Factorial of " + number + " is " + result); } public static int factorial(int n) { if (n == 0) { return 1; // base case } else { return n * factorial(n - 1); // recursive call } } }
Each method call creates a new stack frame that holds its local variables and return address.
Stack memory is limited in size and follows Last In First Out (LIFO) order.
public class StackMemoryExample { public static void main(String[] args) { int a = 10; // stored in stack int b = 20; // stored in stack int sum = add(a, b); // method call stored in stack System.out.println("Sum: " + sum); } public static int add(int x, int y) { return x + y; } }
public class StackMemoryExample { public static void main(String[] args) { int number = 3; int result = factorial(number); System.out.println("Factorial: " + result); } public static int factorial(int n) { if (n == 0) { return 1; } else { return n * factorial(n - 1); } } }
public class StackMemoryExample { public static void main(String[] args) { // Empty main method } }
This program calculates the factorial of a number using recursion. Each recursive call uses stack memory to store its own local variable 'n' and return address. When the base case is reached, the calls return one by one, freeing stack frames.
public class StackMemoryDemo { public static void main(String[] args) { System.out.println("Program started"); int number = 4; System.out.println("Calculating factorial of " + number); int factorialResult = factorial(number); System.out.println("Factorial of " + number + " is " + factorialResult); System.out.println("Program ended"); } public static int factorial(int n) { if (n == 0) { return 1; } else { return n * factorial(n - 1); } } }
Time complexity of recursive factorial is O(n) because it calls itself n times.
Stack memory size is limited; too many recursive calls can cause a StackOverflowError.
Common mistake: forgetting the base case in recursion causes infinite calls and stack overflow.
Use stack memory for temporary data and method calls; use heap memory for objects that live longer.
Stack memory stores method calls and local variables in a Last In First Out order.
Each method call creates a new stack frame that is removed when the method finishes.
Recursion uses stack memory heavily, so always have a base case to avoid errors.
Practice
Solution
Step 1: Understand stack memory role
Stack memory stores data related to method execution like local variables and method calls.Step 2: Differentiate from heap memory
Heap stores objects, while stack stores method calls and local variables.Final Answer:
Method calls and local variables -> Option AQuick Check:
Stack memory = method calls + local variables [OK]
- Confusing stack with heap memory
- Thinking objects are stored in stack
- Mixing static variables with stack data
Solution
Step 1: Recall local variable syntax
Local variables inside methods are declared simply with type and name, e.g., int x = 10;Step 2: Identify invalid keywords
Keywords like 'local' or 'var int' are invalid in Java, and 'static' is not allowed for local variables.Final Answer:
int x = 10; -> Option DQuick Check:
Local variable syntax = type + name + value [OK]
- Using 'local' keyword which doesn't exist
- Trying to use 'static' inside methods
- Confusing 'var' usage in older Java versions
public class Test {
public static void main(String[] args) {
int a = 5;
int b = 10;
int c = add(a, b);
System.out.println(c);
}
public static int add(int x, int y) {
return x + y;
}
}Solution
Step 1: Trace method calls and parameters
Main calls add(5, 10), passing values 5 and 10 as local variables on the stack.Step 2: Calculate return value
Add method returns 5 + 10 = 15, which is stored in c and printed.Final Answer:
15 -> Option AQuick Check:
5 + 10 = 15 [OK]
- Concatenating numbers as strings
- Confusing method parameters with global variables
- Expecting runtime or compile errors
public class Demo {
public static void main(String[] args) {
int result = factorial(4);
System.out.println(result);
}
public static int factorial(int n) {
if (n == 0) return 1;
else return n * factorial(n - 1);
}
}Solution
Step 1: Check recursion base case
The factorial method has a base case: if n == 0 return 1, stopping recursion.Step 2: Confirm recursion correctness
Each recursive call reduces n by 1, so recursion ends properly without stack overflow.Final Answer:
No error, code runs correctly -> Option CQuick Check:
Base case present, recursion safe [OK]
- Assuming missing base case when it exists
- Confusing local variables with stack overflow cause
- Thinking return type is wrong
public static int sum(int n) {
if (n <= 0) return 0;
else return n + sum(n - 1);
}What will happen if you call
sum(1000000) in Java, and why?Solution
Step 1: Analyze recursion depth
Calling sum(1000000) causes 1,000,000 recursive calls, each adding a stack frame.Step 2: Understand stack memory limits
Java's stack size is limited; deep recursion like this exceeds it, causing stack overflow error.Final Answer:
It will cause a stack overflow error due to deep recursion -> Option BQuick Check:
Deep recursion > stack size = stack overflow [OK]
- Assuming recursion always works regardless of depth
- Thinking it runs infinitely without base case
- Confusing runtime errors with compile errors
Ready to prove it?
Pass the test and this pattern moves unknown
