2015-12-31 4 views
5

Nach der Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide Abschnitt "Generations" TitelWird GC immer aufgerufen, auch wenn der Heapspeicher zur Laufzeit ständig verfügbar ist?

Als die junge Generation füllt, verursacht es eine kleine Sammlung, in der nur die junge Generation

gesammelt

und:

Schließlich wird die fest angestellten Generation füllen und gesammelt werden müssen, Ergebnis in einer großen Sammlung, in der der gesamte Haufen gesammelt wird.

Also, wenn die Anwendung der Verteilungsphase beendet hat, und während der Ausführung der Anwendung werden die jungen und fest angestellte Generationen nie (überhaupt in jeder Phase) gefüllt, dann gc wird nicht einmal auftreten?

Wenn es auftritt, was ist der Grund? Denn das scheint der verlinkten Dokumentation zu widersprechen.

+1

Die Speicherverwaltung ist vollständig der JVM vorbehalten. Daher kann eine JVM * die Garbage Collection vorsorglich im Leerlauf ausführen, wenn sie dies möchte. Ich weiß nicht, ob aktuelle JVM-Implementierungen das tun, aber es ist erlaubt. Ihre Angebote stammen aus einer bestimmten JVM-Implementierung (Oracle HotSpot) und sind nicht auf alle JVMs anwendbar. – Andreas

Antwort

6

Also, wenn die Anwendung die Zuteilungsphase abgeschlossen hat, und während der gesamten Ausführung der Anwendung, die jungen und Tenured Generationen sind nicht gefüllt (überhaupt, in keiner Phase), wird die GC nicht einmal vorkommen?

Ja. Wenn die jungen und festgebrachten Generationen nicht (zu irgendeinem Zeitpunkt) gefüllt sind, kann die nicht auftreten (sogar einmal). Es liegt an der JVM-Laufzeit, Speicher zu verwalten, und dazu gehört auch, wann (oder falls) die Garbage Collection stattfindet.

+0

Können Sie über einen Grund nachdenken, warum JVM entscheidet, GC anzurufen? Gibt es einen Grund, den Speicher in diesem Szenario zu verwalten? – user3668129

+0

Ein möglicher Grund, ** könnte ** ein * expliziter * Aufruf von ['System.gc()'] sein (http://docs.oracle.com/javase/8/docs/api/java/lang/System) .html # gc--) (was eine * advisory * -Operation ist, also könnte die JVM * * gc * nicht ausführen) oder wenn ['Runtime.runFinalizersOnExit()'] (https://docs.oracle.com/ javase/8/docs/api/java/lang/Laufzeit.html # runFinalizersOnExit-boolean-) ist 'true'. Ungeachtet dessen, dass es einen Grund gibt, gibt Java Entwicklern keinen Mechanismus zum Ausführen expliziter Speicherverwaltung. –

+1

@ user3668129 Der gleichzeitige Collector versucht, Speicher gleichzeitig zu bereinigen. d. h. bevor der Speicher gefüllt ist und somit jederzeit ausgelöst werden kann. Wenn sich der reservierte Speicherplatz füllt, löst dies einen "Fehler im gleichzeitigen Modus" aus und fällt auf SerialGC. –

Verwandte Themen