Alle Java Objekte auf dem Heap?



  • Werden bei Java alle Objekte (die ja per new erzeugt werden) auf dem Heap abgelegt?



  • die jvm hat einen eigenen heap und einen eigenen stack. die (mit new erzeugten) objekte werden aber alle auf dem java-heap gelegt.

    aber das kannst du nicht direkt mit dem stack/heap der realen maschine vergleichen.



  • Was ist denn der Stack und der Heap einer realen Maschine?



  • Habe im Sun-Forum gelesen, dass lokale Objekte auch auf dem Stack abgelegt werden, habe ich aber wie gesagt nur gelesen, keine Garantie 😉

    MFG John



  • Optimizer schrieb:

    Was ist denn der Stack und der Heap einer realen Maschine?

    eine reale maschine ist dein handy, dein pc oder dein toaster, falls man auf ihm eine jvm implementieren kann 🤡

    durch solche abstraktion lässt sich die jvm leichter an andere plattformen anpassen.

    Stack

    Der Java-Stapel ist das wichtigste Element der Java Virtual Machine, da sie keine Datenregister besitzt. Er speichert die Rahmen der einzelnen Methoden, die die Operanden-Stapel enthalten, auf denen gerechnet wird. Der Java-Stapel entspricht nicht dem Stack der realen Maschine, auf der ein Java Programm abläuft, sondern einer eigenen Datenstruktur, die von der Java Virtual Machine verwaltet wird, die je nach Implementierung eine feste Größe besitzen, expandieren oder auch schrumpfen kann. Der Java-Stapel besteht aus 32-Bit breiten Einträgen. 64-Bit Datentypen, wie z.B. long-Werte, benutzen zwei Positionen.
    Die Bytecode-Befehle arbeiten auf dem Operandenstapel, den jeder Rahmen enthält.

    Heap

    Auf dem Heap der Java Virtual Machine werden neu erstellte Instanzen (Objekte) abgelegt. Ob die Java Virtual Machine für jedes Objekt vom Betriebsystem des Rechners Speicher anfordert oder einen größeren Speicherbereich selbst als Heap verwaltet, ist nicht spezifiziert. Da die Java Virtual Machine mit einer Freispeicherverwaltung arbeitet, muß der Programmierer den nicht mehr benötigten Speicher nicht wieder freigeben (und kann dies auch nicht). Mit welcher Technik eine Java Virtual Machine die Freispeicherverwaltung durchführt ist nicht festgelegt. Ebensowenig der Zeitpunkt. Jedoch kann mit einem Aufruf der Methode gc() (Garbage Collection) eine Speicherbereinigung erzwungen werden.



  • borg schrieb:

    Jedoch kann mit einem Aufruf der Methode gc() (Garbage Collection) eine Speicherbereinigung erzwungen werden.

    Falsch. Damit wird der GC angetriggert. Ob er dann Speicher freigibt weiß man nicht, aber es erhöht die Wahrscheinlichkeit, daß er es tut.



  • borg schrieb:

    Optimizer schrieb:

    Was ist denn der Stack und der Heap einer realen Maschine?

    eine reale maschine ist dein handy, dein pc oder dein toaster, falls man auf ihm eine jvm implementieren kann 🤡

    Meine frage ist nicht, was eine reale Maschine ist, sondern was beispielsweise der Heap einer realen Maschine ist. Eine reale Maschine hat einfach keinen Heap, ein Programm hat einen Heap. Eine reale Maschine hat auch keinen Stack, ein Programm hat einen Callstack (oder mehrere). Das war der Punkt. Es ist nicht so, dass die JVM irgendwelche Heaps und Stacks, die reale Maschinen eingebaut haben, nachsimuliert.

    JohnDoe21 schrieb:

    Habe im Sun-Forum gelesen, dass lokale Objekte auch auf dem Stack abgelegt werden, habe ich aber wie gesagt nur gelesen, keine Garantie 😉

    MFG John

    Das stimmt. Lokale Objekte sind in Java allerdings niemals Objekte von Klassen, sondern Dinge wie int, long, char, float oder eine Referenz auf ein Klassen-Objekt.


Anmelden zum Antworten