JVM.MemoryManagement.How does the JVM manage memory for primitives and objects ?

JVM Memory Management for Primitives and Objects

The Java Virtual Machine (JVM) manages memory using a structured approach, allocating primitives and objects differently within the heap and stack memory.


1. Memory Areas in JVM

The JVM divides memory into different regions:

  • Heap (for objects)
  • Stack (for method execution and local variables)
  • Metaspace (for class metadata)
  • PC Register & Native Method Stack (for execution details)

2. How the JVM Manages Primitives

Where are Primitives Stored?

  • Local variables (inside methods) → Stored in the stack.
  • Instance variables (inside objects) → Stored in the heap (but the object reference itself is in the stack if it’s a local variable).
  • Static variables (class-level variables) → Stored in the Metaspace.

Example of Primitive Storage

public class PrimitiveExample {
    int instanceVar = new SomeClass();   // SomeClass stored in heap
    static int staticVar = 20; // Stored in metaspace

    void method() {
        int localVar = 30;  // Stored in stack
    }
}

3. How the JVM Manages Objects

Where are Objects Stored?

  • All objects are stored in the heap, regardless of where they are created.
  • References to objects (pointers) are stored on the stack when used as local variables.

Example of Object Storage

public class ObjectExample {
    public static void main(String[] args) {
        Person p1 = new Person("John"); // "p1" is on stack, Person object is on heap
    }
}

class Person {
    String name;  // Stored in heap

    Person(String name) {
        this.name = name; // "name" is a reference to a String in heap
    }
}

4. Memory Allocation Process

  1. Primitive variables are stored directly in the stack or inside an object in the heap.
  2. Objects are allocated on the heap, and references to them are stored in the stack (if they are local).
  3. Garbage Collection (GC) cleans up heap memory by removing objects that are no longer reachable.

5. Key Differences Between Primitives and Objects in Memory

FeaturePrimitive VariablesObjects
Storage LocationStack (or inside heap if part of an object)Heap
Reference Needed?No (value stored directly)Yes (stack stores reference)
Garbage Collected?No (automatically removed when method exits)Yes (GC removes unreachable objects)

6. Example Memory Layout

public class JVMExample {
    public static void main(String[] args) {
        int a = 5;  // Stored in stack
        Person p = new Person("Alice"); // "p" (reference) is in stack, object is in heap
    }
}

Memory Representation

Stack:

Person object {
    name = "Alice"
}

Metaspace (for Class Data):

Person class metadata

7. Garbage Collection (GC) in Heap Memory

  • The stack is automatically managed, but the heap is managed by the garbage collector (GC).
  • Objects are removed when they have no active references.
  • GC follows a Mark-and-Sweep approach to identify unused objects.

8. Optimization Tips

  • Use primitive types when possible to avoid unnecessary object creation.
  • Use StringBuilder instead of concatenation (+) to reduce temporary object creation.
  • Be mindful of large objects in heap (e.g., arrays, collections).
  • Use tools like VisualVM, JProfiler, or Eclipse MAT to analyze memory usage.

Conclusion

  • Primitives are lightweight and stored in the stack or inside objects.
  • Objects live in the heap and are managed by the GC.
  • References to objects are stored in the stack when used locally.
  • Proper memory management helps optimize Java application performance!
This entry was posted in Без рубрики. Bookmark the permalink.