# Heap und Stack



## David2456 (1. Dez 2015)

Hallo,
in meiner Aufgabe soll ich die Informationen der Variablen im Heap und Stack in den gewünschten Zeitpunkten angeben. Jedoch werde ich aus dem Beispiel nicht schlau. Kann mir einer weiterhelfen? Stack ist doch sogesehen das Gedächtnis der momentan verwendeten Methode und Heap das Gedächtnis einer Methode, welche in einer anderen Methode aufgerufen wird, oder nicht? Bitte korrigieren falls ich falsch liege. Falls der Code noch als Text erforderlich sein sollte bitte anschreiben.

Danke schonmal


----------



## Tobse (1. Dez 2015)

Der Heap ist der Speicherbereich (=Gedächtnis), in welchem Objekte und deren Eigenschaften gespeichert sind. Der Stack speichert, welche Methode von wo aufgerufen wurde und die Parameter, die übergeben wurden. Aber merke: der Stack enthält bei nicht-nativen Datentypen (nativ=boolean,short,char,int,long,float,double) nur eine Referenz auf das Objekt im Heap.


----------



## InfectedBytes (1. Dez 2015)

kleine Ergänzung, der Stack enthält nicht nur die parameter, sondern alle lokalen Variablen. 
Objekte und auch Arrays liegen immer im Heap, auf dem Stack liegt nur eine Referenz in den Heap.


----------



## Flown (2. Dez 2015)

Zur Klarstellung: Arrays sind Objekte und nicht etwas gesondertes!


----------



## InfectedBytes (2. Dez 2015)

das ist richtig, habe mich wohl etwas unglücklich ausgedrückt^^
Auch wenn die JVM interessanterweise im Detail ein paar unterschiede macht^^


----------



## Thallius (2. Dez 2015)

Ganz sicher, dass ein

final int a[]  = {1,2,3,4};

auf den Heap gelegt wird?

Gruß

Claus


----------



## InfectedBytes (2. Dez 2015)

Jo, auch lokale und konstante Arrays landen im Heap. Die JVM erzeugt Arrays immer dynamisch, weswegen sie auch im Heap landen.


----------



## Tobse (2. Dez 2015)

Thallius hat gesagt.:


> Ganz sicher, dass ein
> 
> final int a[]  = {1,2,3,4};
> 
> ...



Das ist ein Spezialfall. Dieses Array landet nirgendwo sondern wird vom Compiler "inlined", siehe CTFE.


----------



## InfectedBytes (2. Dez 2015)

ich glaube nicht das der Compiler das inlined. 
wenn man sich den bytecode zum obigen code ansieht (via javap) dann wird dort das array ganz normal erzeugt:

```
final int[]arr = {1,2,3};
```


```
0: iconst_3
 1: newarray       int
 3: dup
 4: iconst_0
 5: iconst_1
 6: iastore
 7: dup
 8: iconst_1
 9: iconst_2
10: iastore
11: dup
12: iconst_2
13: iconst_3
14: iastore
```


----------

