JVM-geheugenarchitectuur begrijpen

Code optimaliseren in Java

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

Wat is de JVM?

  • Platformonafhankelijke uitvoeringsomgeving
  • Zet bytecode (.class) om naar machinecode
  • Geheugenbeheer en garbage collection
  • Just-In-Time-compilatie
Code optimaliseren in Java

Overzicht JVM-geheugenarchitectuur

De JVM-geheugenarchitectuur

Code optimaliseren in Java

Stackgeheugen

  • Geheugen voor methode-uitvoering en lokale variabelen
  • LIFO-structuur (Last-In-First-Out)
  • Slaat op:
    • Lokale variabelen
    • Primitieve datatypen
    • Methodeaanroep-informatie
  • StackOverflowError bij overschrijding
Code optimaliseren in Java

Heapgeheugen

  • Slaat alle objecten en arrays op
  • new maakt een object en plaatst het op de heap
  • Beheerd door de garbage collector
  • Dynamische grootte
  • Opgedeeld in generaties
Code optimaliseren in Java

Geheugen in actie

public void processData() {
    int count = 0;                  // Stack

String name = "Java"; // Heap
List<String> items = // Referentie op stack new ArrayList<>(); // Object op heap
items.add(new String("Item")); // Object op heap }
Code optimaliseren in Java

Geheugenzuinige codepatronen

// Inefficiënt
List<String> list1 = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
    String s = new String("value"); // 1000 objecten
    list1.add(s);
}

// Beter
List<String> list2 = new ArrayList<>();
String s = "value";  // Eén object
for (int i = 0; i < 1000; i++) {
    list2.add(s);
}
Code optimaliseren in Java

Samenvatting

  • JVM beheert geheugen via (vooral) stack en heap
  • Stackgeheugen -> snel, slaat primitieve types en referenties op
  • Heapgeheugen -> slaat objecten op
Code optimaliseren in Java

Laten we oefenen!

Code optimaliseren in Java

Preparing Video For Download...