Heim  >  Artikel  >  Java  >  Was ist ein konstanter Pool in Java? Einführung in Java Constant Pool

Was ist ein konstanter Pool in Java? Einführung in Java Constant Pool

不言
不言Original
2018-09-20 14:40:448345Durchsuche

Der Inhalt dieses Artikels befasst sich mit der Frage, was der konstante Pool in Java ist. Die Einführung des Java-Konstantenpools hat einen gewissen Referenzwert. Ich hoffe, dass er für Sie hilfreich ist.

Konstanter Pool in Java

In der Java Virtual Machine JVM ist die Speicherverteilung: Heap der virtuellen Maschine, Programmzähler, lokaler Methodenstapel, Stapel der virtuellen Maschine, Methodenbereich.

Was ist ein konstanter Pool in Java? Einführung in Java Constant Pool

Der Programmzähler ist die Pipeline des JVM-Ausführungsprogramms und wird zum Speichern einiger Anweisungen verwendet. Der lokale Methodenstapel ist der Stapel, der von der JVM-Betriebssystemmethode verwendet wird Der Stapel der virtuellen Maschine ist Der zum Ausführen des Programmcodes verwendete Stapel enthält Klassenvariablen, Klasseninformationen, Methodeninformationen und Konstantenpools (Symbolreferenzen in Form von Tabellen). Der Heap ist der von der virtuellen Maschine verwendete Heap Programmcode auszuführen.

Konstant? Es handelt sich um eine Größe, die nicht mehr geändert werden kann, sobald der Wert mit endgültigen Konstanten geändert wurde.

Was ist ein Klassendatei-Konstantenpool?

Wir wissen, dass es in der Klassendatei Klassenversionsinformationen, Feldinformationen, Methoden, Schnittstellen und andere Informationen gibt, und es gibt auch einen konstanten Pool. Dies ist der Konstantenpool der Klassendatei.

Was wird im Konstantenpool der Klassendatei hauptsächlich zum Speichern verwendet?

speichert verschiedene Literale und Symbolreferenzen, die durch die Kompilierung generiert werden. In der Informatik ist ein Literal eine Notation, die verwendet wird, um einen festen Wert im Quellcode auszudrücken. Eine symbolische Referenz ist eine Reihe von Symbolen, die zur Beschreibung des referenzierten Ziels verwendet werden. Dabei kann es sich um jede beliebige Form eines Literals handeln, sofern diese eindeutig verwendet werden kann Suchen Sie einfach das Ziel.

Der Konstantenpool liegt in Form einer Tabelle vor (die Tabelle wird zum Speichern von Zeichenfolgenwerten und nicht von Symbolreferenzen verwendet. Er kann tatsächlich in zwei Typen unterteilt werden: der eine ist der statische Konstantenpool und der andere). ist der Laufzeitkonstantenpool. Es gibt 11 Konstantentabellen im Konstantenpool. Jede Konstante im Konstantenpool repräsentiert eine Tabelle.

Konstante Tabelle

常量表类型 标志值 描述
CONSTANT_Utf8 1 UTF-8编码的Unicode字符串
CONSTANT_Integer 3 int类型的字面值
CONSTANT_Float 4 float类型的字面值
CONSTANT_Long 5 long类型的字面值
CONSTANT_Double 6 double类型的字面值
CONSTANT_Class 7 对一个类或者是接口的符号引用
CONSTANT_String 8 String类型的字面值的引用
CONSTANT_Fieldref 9 对一个字段的符号
CONSTANT_Methodref 10 对一个类中方法的符号应用
CONSTANT_InterfaceMethodref 11 对一个接口中方法的符号引用
CONSTANT_NameAndType 12 对一个字段或方法的部分符号引用

Konstanter Pool

Integer integer1 = 127;
Integer integer2 = 127;
System.out.println(integer1 == integer2);
// true
Integer integer1 = 128;
Integer integer2 = 128;
System.out.println(integer1 == integer2);
// false

In Java wird das Symbol „==" zum Vergleichen von Adressen verwendet. Das Symbol „gleich" ist standardmäßig dasselbe wie das Symbol „==" und wird zum Vergleichen verwendet Adressen.

String string1 = "dashu";
String string2 = "dashu";
System.out.println(string1==string2);
// true
rrree

String str = new String("dashu"); Wie viele Objekte werden erstellt?
Die Antwort lautet: 2 oder 1.

Wenn in new String("dashu"); der Literalwert "dashu" bereits im Konstantenpool erscheint, wird nur ein Objekt erstellt, andernfalls werden zwei Objekte erstellt.

Prinzip: Wenn das Literal „dashu“ erscheint, sucht das System im String-Konstantenpool, um zu sehen, ob derselbe String vorhanden ist. Wenn ja, wird kein neues Objekt erstellt, andernfalls wird das Literal verwendet Der Wert „dashu“ erstellt ein String-Objekt. Und neuer String („dashu“) mit dem Schlüsselwort new bedeutet, dass definitiv ein neues Objekt erstellt und dann der Konstruktor aufgerufen wird, der den String-Parameter zur Initialisierung empfängt.

Bei Änderung in string1 == string3.intern() ist das Ergebnis wahr, da die Adresse des Literalwerts im Konstantenpool zurückgegeben wird.

Stapel: Thread-Stack und lokaler Methodenstapel

String string1 = "dashu";
String string3 = new String("dashu");
System.out.println(string1 == string3);
// false

hat den Modifikator native und wird durch JNI geändert, um die c-Sprache oder die c++-Ausführung aufzurufen.

Alle Klassen sind Unterklassen von Object.

// 源码
public class Object{
 private static native void registerNatives();
 static{
  registerNatives();
 }
}
// 源码
public boolean equals(Object obj){
 return (this == obj);
}
// 源码
public String toString(){
 return getClass().getName() + "@" + Integer.toHexString(hasCode());
}
// 源码
protected native Object clone() throws CloneNotSupportedException;

Konstantenpool:
Alle Konstanten werden in der Klassendatei gespeichert
In Java heißt es, dass der Konstantenpool in zwei Formen unterteilt werden kann: statischen Konstantenpool und Laufzeitkonstantenpool.

Der statische Konstantenpool ist der Konstantenpool in der Klassendatei. Er enthält Zeichenfolgenliterale, Klasseninformationen, Methodeninformationen usw. Er nimmt einen großen Teil des Speicherplatzes in der Klassendatei ein Literale und Symbolreferenzen.

Der Laufzeitkonstantenpool ist der Vorgang der Java Virtual Machine nach Abschluss des Klassenladens. Er lädt den Konstantenpool in der Klassendatei in den Speicher und stellt sicher, dass er sich im Methodenbereich befindet Der Aufruf erfolgt im Methodenbereich. Der laufende Konstantenpool ist dynamisch und während der Ausführung können neue Konstanten generiert und in den Pool eingefügt werden. Dies ist der oben beschriebene Code. Konstanten müssen nicht beim Kompilieren generiert werden, neue Ausgaben können auch zur Laufzeit generiert und in den Pool gestellt werden.

Die folgende Analyse:

Wenn die Java Virtual Machine JVM eine bestimmte Klasse ausführt, muss sie die Klasse vom Laden in den Speicher bis zum Entladen durchlaufen.

Der gesamte Prozess besteht aus Laden, Verifizieren, Vorbereiten, Parsen, Initialisierung, Verwendung und Deinstallation.

Laden,

Überprüfen Sie, ob die Version der Klassendatei mit der aktuellen Version der Java Virtual Machine kompatibel ist. Anschließend muss die Klassendatei den Spezifikationen der virtuellen Maschine entsprechen.

Vorbereitung, was müssen Sie vorbereiten?
Es ist notwendig, Klassenmitglieder auf ihre Anfangswerte zu initialisieren, mit Ausnahme von durch final geänderten Klassenvariablen. Endgültige Variablen werden direkt auf Variablenwerte initialisiert, während Klassenmitglieder unterschiedlich sind.

Analyse, was ist Analyse?
Es geht darum, die Symbolreferenz in eine direkte Referenz zu analysieren, die unsere Variable xxx ist. Diese Darstellung wird zu einer direkten Referenz. Es handelt sich um die Speicheradresse, z. B. unsere gemeinsame Adresse xxx0203r0e.

Initialisierung: Die statisch geänderten Variablen oder statischen statischen Codeblöcke bestehen aus Konstruktoren, um die Variablen zu initialisieren.

Verwenden,

Deinstallieren

Wenn die Klasse in den Speicher geladen wird, speichert die JVM den Inhalt des Klassenkonstantenpools im Laufzeitkonstantenpool, also der Laufzeit konstanter Pool Jede Klasse hat einen.

Der Klassenkonstantenpool speichert Referenzen auf Literale und Symbole. Nach dem Parsen wird die symbolische Referenz in eine direkte Referenz analysiert Konstante wird nach dem Parsen gespeichert. Das ist ein direktes Zitat. Stellen Sie dann sicher, dass jede JVM nur eine Kopie im globalen Konstantenpool hat, in der der direkte Referenzwert der Zeichenfolgenkonstante gespeichert ist.

Bei Änderung in „string1 == string3.intern()“ ist das Ergebnis wahr, da die Adresse des Literalwerts im Konstantenpool zurückgegeben wird.

Die intern()-Methode der String-Klasse sucht im Konstantenpool, um zu sehen, ob es eine Zeichenfolge gibt, die gleich equal() ist.

万物皆对象
// 源码注解
Class {@code Object} is the root of the  class hierarchy.
Every class has {@code Object} as a superclass.
All objects, including arrays, implements the methods of this class.
@ see java.lang Class
@ since JDK1.0

Wenn im Konstantenpool kein “dashu”-Literal vorhanden ist, wird zuerst der Literal-“dashu”-Wert in die Konstantentabelle eingefügt und dann die Adresse der Konstantentabelle zurückgegeben.

Vorteile des konstanten Pools

Der konstante Pool kann die häufige Erstellung und Zerstörung von Objekten vermeiden, was zu einer Verringerung der Systemleistung führt, und realisiert auch die gemeinsame Nutzung von Objekten, was zu Einsparungen führen kann Speicherplatz und Laufzeit.

Das obige ist der detaillierte Inhalt vonWas ist ein konstanter Pool in Java? Einführung in Java Constant Pool. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn