it-swarm.com.de

Perm Space gegen Heap Space

Erstens: Was ist der Unterschied zwischen Perm-Speicherplatz und Heap-Speicherplatz (Was und wie wählt die JVM die einzelnen Speicherbereiche aus)?

Zweitens, aber vor allem, welches Verhältnis wird für eine Standard-Java-Anwendung vom MVC-Typ empfohlen?

76
Gareth

Der heap speichert alle Objekte, die von Ihrem Java-Programm erstellt wurden. Der Inhalt des Heapspeichers wird vom Garbage Collector überwacht, der Speicher freigibt, wenn Sie die Verwendung eines Objekts beenden (d. H. Wenn keine weiteren Verweise auf das Objekt mehr vorhanden sind.

Dies steht im Gegensatz zu stack, das primitive Typen wie ints und Zeichen speichert und in der Regel lokale Variablen und Funktionsrückgabewerte sind. Dies ist kein Müllsammlung.

Der perm-Raum bezieht sich auf einen speziellen Teil des Heapspeichers. In dieser Antwort SO finden Sie eine Erklärung: Was ist Perm-Space?

76
Olhovsky

Persönlich würde ich PermGen nicht als besonderen Teil des Haufens betrachten. 

Ich würde viel lieber Heap als einen Speicherbereich betrachten, der zum Speichern von Objektinstanzen bestimmt ist, während PermGen als ein Bereich zum Speichern von Klassendefinitionen dient. Folglich ist der Lebenszyklus eines Heaps an eine Anwendung gebunden, während der Lebenszyklus von PermGen an eine JVM gebunden ist. 

Eines der besten Beispiele, warum eine Anwendung und ihre JVM einen unterschiedlichen Lebenszyklus haben können, ist in einem Java EE-Container. In einem App-Server können Anwendungen bereitgestellt und nicht bereitgestellt werden, ohne dass der Server neu gestartet werden muss. Während der Aufhebung der Bereitstellung (oder erneuten Bereitstellung) ist es einfach, alle Objektinstanzen freizugeben, d. H. Heapspeicherplatz. Es ist jedoch ziemlich schwierig, alle von dieser App geladenen Klassen aus PermGen zu löschen, da einige Klassen noch von der JVM referenziert werden können.

Ein solcher Fall ist der Leaking Drivers . Wenn eine App bereitgestellt wird, wird ein JDBC-Treiber geladen und beim DriverManager registriert. Wenn diese App nicht bereitgestellt wird, bleibt der DriverManager aktiv und enthält einen Verweis auf den Treiber, seinen ursprünglichen Klassenlader und alles, was dieser Klassenlader geladen hat. In PermGen wird dadurch ein Speicherverlust erzeugt, aber es liegt kein Fehler in der Speicherverwaltung der Anwendung vor.

Es ist wahr, dass JVMs wie JRocket überhaupt kein PermGen haben, alles wird in einem Heap gespeichert. Nur in einem solchen Kontext können Sie PermGen als "besonderen Teil" des Heaps bezeichnen. Selbst dann sollten wir PermGen und Heap immer noch anders betrachten, da sie sehr unterschiedliche Zwecke haben und sehr unterschiedliche Arten von Speicherverlusten haben.

Update: In JDK 8 von Oracle wird PermGen durch "Metaspace" ersetzt und ist jetzt offiziell Teil des Heapspeichers. Wir müssen PermGen nicht mehr speziell anpassen.

33

Sie können dem zugewiesenen Speicher im Heap KEINE Namen zuweisen. 

Das bedeutet, dass int x (sein Name) im Stack zugeordnet ist. Sie können den Zeiger über seinen Namen erreichen, sodass sich der Zeiger im Stapel befindet. Sie können das Objekt nicht über seinen Namen erreichen, da es keinen Namen hat. Zugriff auf das (namenlose) Objekt muss durch seinen Zeiger erfolgen.

0
Pete Del Fina