Java: Stack vs. Heap

Categories: Java

Stack vs Heap

1. Stack
1.1. Struktur

Der Stack stellt einen Speicherbereich dar der in Form eines LIFO Puffers (Last In – Fist Out) organisiert ist. Elemente die zuerst auf dem Stack abgelegt werden liegen unten, die zuletzt abgelegten Elemente liegen oben. Durch die Struktur des Stacks und der hierdurch sehr effizienten Verwaltung, sind Stack-Operationen in der Regel sehr performant.

1.2. Stack und Threads

Jedem Thread wird für seinen Thread-Stack ein Speicherbereich mit initialer, fixer Größe zugewiesen. Werden Daten auf den Stack gelegt, so wächst dieser an und schrumpft wenn diese Elemente finalisiert werden. Meist variiert die Größe des Stracks zwischen 64 KB und 8M. Über Parameter der Laufzeitumgebung kann (z. B. über die Entwicklungsumgebung) die Strack-Größe beeinflusst werden.

2. Heap
2.1. Struktur

Im Gegensatz zum Stack stellt der Heap einen intern aufwendiger zu verwaltenden und somit weniger effizient organisierten Speicherbereich dar, der allerdings auch deutlich weniger in seiner Größe begrenzt ist. Er kann bis zur Speichergrenze auf Prozessebene anwachsen.

2.2. Heap und Threads

Der Zugriff auf den Heap erfolgt primär über Zeiger. Dies ist nicht immer ersichtlich, so verwendet beispielsweise Java sog. Objektreferenzen um auf Objekte zuzugreifen die auf dem Heap liegen. Der Zugriff auf die Objekte des Heaps erfolgt global, d.h. der Sichtbarkeitsbereich der Objekte des Heap ist nicht beschränkt, es kann auf diese zugegriffen werden sobald ein Zeiger (oder eine Objektreferenz) vorhanden ist.

3. Zusammenfassung

Stack

  • Begrenzte Größe
  • Schneller Zugriff (lesen, schreiben, löschen)
  • LIFO Struktur
  • Nutzung für lokale Variablen und Methoden-Parameter

Heap

  • Beliebige Größe (innerhalb der Prozessgrenze)
  • Langsamer Zugriff (lesen, schreiben, löschen)
  • Objekte können global genutzt werden

4. Anmerkungen

  • In Sprachen ohne Garbage Collector muss der Speicher des Heap manuell freigegeben werden. Wird dieser Aufräumprozess vergessen so kann schnell ein Memory Leak entstehen was letztendlich den Speicher des Systems überlaufen lässt.
  • Die Entscheidung ob Elemente auf den Stack oder Heap kommen wird in Programmiersprachen wie z. B. Java automatisch getroffen und der Entwickler hat keinen Einfluss darauf.
«
»

    Leave a Reply

    Your email address will not be published. Required fields are marked *