Primitive können an beiden Orten gefunden werden.
außer Sie sollten nicht wirklich kümmern, es sei denn, Sie bauen eine JVM. Ein wirklich schlauer Optimierer könnte entscheiden, dass das Foo, auf das f zeigt, niemals aus dem Hauptbereich austritt und niemals an eine andere Funktion weitergegeben wird, die es sicher auf dem Stapel zuweisen kann.
In Bezug auf das Update:
Der Stack und den Heap sind nicht zu unterscheiden, was in ihnen gespeichert ist, sondern vielmehr die Operationen für sie zur Verfügung gestellt. Der Stapel erlaubt Ihnen, ein Stück Speicher in einer LIFO-Weise zuzuordnen, Sie können ein Stück nicht freigeben, bis alle Teile, die jünger als es sind, ebenfalls freigegeben wurden. Dies passt sich bequem an, wie ein Call-Stack verwendet wird. Sie können alles auf den Stapel legen, solange es in Ordnung ist, dass das Ding verschwindet, wenn Ihre Funktion zurückkehrt. Dies ist eine Optimierung, da sie sehr schnell von einem Stapel zugewiesen und freigegeben wird, da sie nur auf diese Weise unterstützt wird. Man könnte alle lokalen Variablen für eine Funktion auf dem Heap in einer Implementierung speichern, wenn man möchte. Der Heap ist flexibler und folglich teurer zu verwenden. Es wäre nicht richtig zu sagen, dass ein Objekt einen Stack und einen Heap hat, wie ich bereits sagte, was den Stack vom Heap unterscheidet, ist nicht das, was drin ist, sondern die verfügbaren Operationen.
Jeder Thread hat seinen eigenen Stapel, nicht jedes Objekt. Wenn es nur einen Thread gibt, dann gibt es nur einen Stack. – Alex