Java: Memory Nutzung der Schlüsselwort final?
Beim deklarieren einer final
variable (Konstante) in einer Klasse, zum Beispiel:
private static final int MyVar = 255;
Wie viel Arbeitsspeicher wird dieses verlangen, wenn ich 100.000 Instanzen der Klasse, die erklärt?
Wird es link die variable der Klasse und haben somit 1*MyVar memory-Nutzung (ohne den internen Zeiger), oder wird es den link auf die Instanz dieser variable und erstellen von 100.000*MyVar Kopien dieser variable?
Unglaublich schnelle Antwort! Der Konsens scheint zu sein, dass, wenn eine variable ist statisch und final, dann wird es erfordern 1*MyVar. Vielen Dank an alle!
- Es ist die Tatsache, dass es statisch ist, dass ist wichtig in Bezug auf die Zuweisung von Speicher. Finale hat keinen Einfluss auf Sie
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
final
Schlüsselwort ist irrelevant für die Menge an Arbeitsspeicher verwendet wird, da es nur bedeutet, dass Sie nicht ändern können, den Wert der Variablen.Allerdings, da die variable deklariert ist
static
, gibt es nur eine solche variable, die gehört zur Klasse und nicht zu einer bestimmten Instanz.Entnommen hier:
static final
und verwenden Sie nur die Variablen, die ohne die Schaffung Instanz der Klasse. Wird diese Konstante Variablen werden im Speicher gehalten, auch wenn ich Sie nicht verwenden, wenn die app gestartet wird? (oder im Stapel, da Variablen, primitive)Gibt es nur 1*MyVar memory-Nutzung, da ist es erklärt wie
static
.Die statische Deklaration bedeutet, dass es nur eine Instanz für die Klasse und deren Unterklassen (es sei denn, Sie überschreiben MyVar).
Einem int ist eine vorzeichenbehaftete 32-bit 2er-Komplement Ganzzahl primitiv, so dauert es 4 bytes, um es zu halten, wenn Ihr Beispiel nicht statisch, Sie würden nur multiplizieren, indem Sie die Anzahl der Instanzen, die Sie haben (bei Ihrem Beispiel zu 100.000 Instanzen das ist 0.38 eines megabyte - für das Feld allein, zusätzlichen Aufwand, der für die tatsächlichen Klassen).
Den final-modifier auf ein Feld bedeutet, es kann nicht sein, repointed zu einem anderen Wert (in der Erwägung, dass endgültig auf eine Klasse von Verfahren bedeutet, es kann nicht überschrieben werden).
Ist es statisch und damit Klasse Anwendungsbereich -> 1.
Edit: tatsächlich, es hängt von der Klasse loader. Im Allgemeinen Fall müssen Sie eine Kopie der Klasse, aber wenn Sie mehrere class loader/class-repositories, könnte der Fall in Anwendung-Server etc.) Sie könnten am Ende mit mehr.
Zusätzlich zu der Tatsache, dass
static
Felder gehören zu Ihren Klassen, und somit gibt es nur eine Instanz vonstatic
varaible pro Klasse (und pro classloader), es ist wichtig zu verstehen, dassstatic final
Variablen initialisiert durch compile-time-Konstante Ausdrücke sind eingebettet in Klassen, die Sie verwenden.JLS §13.1 Die Form eines Binären:
So, in der Praxis, die Instanz von
static final
variable, die gehören zu seiner Klasse ist nicht die einzige Instanz der Wert der variable - es gibt auch andere Instanzen, die Wert eingebettet in Konstanten-pools (oder Codes) von Klassen, die die Verwendung der Variablen in Frage.In der Praxis bedeutet es, dass, wenn Sie ändern Sie den Wert von
Foo.S
in der KlasseFoo
, aber nicht neu kompilieren KlasseBar
, KlasseBar
drucken wird der alte WertFoo.S
.statische bedeutet, Sie haben nur eine instatnce
letzten nur bedeutet, dass Sie können nicht zuweisen, der Wert.
final
hat keine Auswirkungen auf den Speicherbedarf.static
nicht eine Wirkung haben.Entscheidend ist hier, dass die Sie deklariert die variable als
static
da statische Variablen sind gemeinsamen unter allen Instanzen der Klasse, so dass nur so viel Platz wie eine Instanz der variable. Deklarieren Sie eine variablefinal
macht es unveränderlich außerhalb seiner Deklaration oder Konstruktor.final
macht ist1*instances
Speichernutzung.Jedoch
static
macht es einfach1
.1
werden 4 bytes oder 8 bytes, abhängig von der tatsächlichen JVM verwendet. (Auf einem 64-bit-JVM, Sie könnte verschwenden nur 4 bytes, wegen word-alignment-Probleme.)Dem Schlüsselwort "final" hilft Ihnen, deklarieren Sie eine Konstante mit einem bestimmten Betrag von Speicher, in denen das Schlüsselwort "static" als Präfix gibt eine Instanz dieses Konstante, was auch immer der Betrag sein, der Arbeitsspeicher verbraucht...!!!
Es ist statisch, es wird also nur eine Instanz erstellt, also, wie viele bytes nötig zu halten, eine int-primitiven zugeordnet werden
Haben Sie eine Instanz pro Klasse. Wenn Sie die Klasse geladen, mehr als einmal (in einer anderen class loader) wird einmal geladen werden pro class loader geladen.
BTW: der Speicher ist überraschend Billig in diesen Tagen. Auch wenn es eine Kopie pro Instanz, die Zeit, die es dauert, Sie zu Fragen, die Frage ist mehr Wert, als die Erinnerung Sie sparen. Sie sollten es machen
static final
für Klarheit statt der Leistung. Übersichtlicher code ist einfacher zu warten und ist oft effizienter, als gut.static
variable bestimmt, dass es ein Exemplar pro Klasse. Diefinal
ist für Klarheit.Statisch bedeutet, eine Instanz pro Klasse statische variable einmal erstellt und geteilt werden können zwischen verschiedenen Objekt.
Letzte variable, einmal mit dem Wert initialisiert, es kann nicht geändert werden. Endgültige statische variable verwenden, zum erstellen von Konstanten (Unveränderlichen) und beziehen sich direkt, ohne mit dem Objekt.