JVM:s minnesarkitektur

Optimera kod i Java

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

Vad är JVM?

  • Plattformsoberoende körmiljö
  • Konverterar bytekod (.class) till maskinkod
  • Minneshantering och skräpinsamling
  • Just-In-Time-kompilering
Optimera kod i Java

Översikt av JVM:s minnesarkitektur

JVM:s minnesarkitektur

Optimera kod i Java

Stackminne

  • Minnesområde för metodexekvering och lokala variabler
  • LIFO-struktur (sist in, först ut)
  • Lagrar:
    • Lokala variabler
    • Primitiva datatyper
    • Information om metodanrop
  • StackOverflowError om storleken överskrids
Optimera kod i Java

Heapminne

  • Lagrar alla objekt och arrayer
  • new skapar ett objekt och allokerar det i heapen
  • Hanteras av skräpinsamlaren
  • Dynamisk storlek
  • Uppdelat i generationer
Optimera kod i Java

Minnet i praktiken

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

String name = "Java"; // Heap
List<String> items = // Reference on Stack new ArrayList<>(); // Object on Heap
items.add(new String("Item")); // Object on Heap }
Optimera kod i Java

Minnesvänliga kodningsmönster

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

// Better
List<String> list2 = new ArrayList<>();
String s = "value";  // Single object
for (int i = 0; i < 1000; i++) {
    list2.add(s);
}
Optimera kod i Java

Sammanfattning

  • JVM hanterar minnet huvudsakligen via stack och heap
  • Stackminne -> snabbt, lagrar primitiver och referenser
  • Heapminne -> lagrar objekt
Optimera kod i Java

Nu kör vi en övning!

Optimera kod i Java

Preparing Video For Download...