Memory Management in JAVA:
When you are starting the JVM then JVM will request some memory from the OS. if OS allocates the required memory then JVM will start otherwise the error message will be displayed and JVM will not start.
For example,
public class MemoryManagement {
public static void main(String str[]) {
System.out.println("**Main Started**");
Runtime rt = Runtime.getRuntime();
System.out.println("T : "+rt.totalMemory());
System.out.println("M : "+rt.maxMemory());
}
}
Execute as follows:
java -Xms512m MemoryManagement
java -Xmx1024m MemoryManagement
java -Xmx2048m MemoryManagement
-Xms stands for Initial Memory
-Xmx stands for Max Memory
When a JVM executes a program, it needs memory to store many things like:
i. Byte Codes and other information extracted from loaded class files.
ii. Objects created in your program.
iii. Methods Parameters.
iv. Values returned from methods.
v. Local variables declared.
vi. Intermediate resultsof computations.
The JVM organizes the memory into several runtime data areas. Some are:
1. Method Area:
- When the class is loaded by the JVM then the class information will be stored into the method area.
- Method area is also called as Class Heap.
- Static Variable also gets the memory in method area.
- Each instance of the JVM has one method area.
- This area is shared by all threads running inside the virtual machine.
- These memories should not be de-allocated during the execution of the application.
2. Heap Memory:
- JVM places all objects into the heap memory.
- Each instance of the JVM has one heap area.
- This area is shared by all threads running inside the virtual machine.
- If you have the reference of the object in your application then it is known as USED or LIVE object.
- if you do not have the reference for the object in your application then the object is known as UNUSED or DEAD object and is called as Garbage.
- There is no guarantee that memory for the UNUSED or DEAD objects will be de-allocated immediately.
- When you create the object and required memory is not available in the HEAP then OutOfMemoryError will be thrown by JVM.
3. Stack Memory:
- Stack Memory keep track of each and every method invocations. This is called Stack Frame.
- Each thread has its own PC Register(Program Counter) and Java Stack Frame.
- When the method or constructor is invoked then the implementation will be copied into the stack memory on the top of the stack. after completing the execution of the method or constructor, memory from the stack will be de-allocated.
- Memory for local variables and method arguments are allocated in Stack Memory.
- The program counter always keeps track of the current instruction which is being executed. After execution of an instruction, the JVM sets the PC to next instruction.
- When you invoke method or constructor and required memory is not available in the STACK then StackOverflowError will be thrown by the JVM.