What are static methods and how are they used?

The Java Virtual Machine (JVM) divides memory into several sections to efficiently manage different types of data used in a Java program. These memory sections are:

1. Heap Memory:

  • Purpose: Used for dynamic memory allocation. This is where all the objects created by your Java application are stored.
  • Characteristics:
    • It is shared among all threads of the application.
    • Memory management in the heap is managed by the Garbage Collector, which automatically removes objects that are no longer in use to free up memory.

2. Stack Memory:

  • Purpose: Used for storing temporary variables created by methods (method calls). Each thread in a Java application has its own stack.
  • Characteristics:
    • Stores primitive data types (like int, char, etc.) and references to objects (not the objects themselves).
    • Memory is allocated and deallocated in a last-in, first-out (LIFO) order, following method invocation and completion.

3. Method Area:

  • Purpose: Stores class structure information, such as runtime constant pool, field and method data, and code for methods and constructors, including static variables.
  • Characteristics:
    • Shared among all threads.
    • Sometimes called the “Permanent Generation” (PermGen) in older versions of Java or "Metaspace" in Java 8 and above.

4. Program Counter (PC) Register:

  • Purpose: A small memory space that holds the address of the currently executing Java virtual machine instruction.
  • Characteristics:
    • Each thread has its own PC register for tracking the execution of its instructions.

5. Native Method Stack:

  • Purpose: Used for executing native methods (methods written in languages other than Java, like C or C++).
  • Characteristics:
    • Each thread has its own native method stack.
    • It stores the state of each native method invocation.