String.intern-Prinzip
Der Konstantenpool in Jdk6 befindet sich in PermGen (permanente Generation)String.intern():
Diese Methode ist eine native Methode
Die zugrunde liegende Methode wird durch Aufrufen der StringTable::intern-Methode von C++ implementiert
Wenn die intern()-Methode über die Anweisung str aufgerufen wird. intern()
JVM Es wird im Konstantenpool der aktuellen Klasse gesucht, ob es einen String mit dem gleichen Wert wie str gibt. Wenn vorhanden, wird direkt die Referenz des entsprechenden Strnig im Konstantenpool zurückgegeben. Wenn dies nicht der Fall ist vorhanden ist, wird ein äquivalenter String im Konstantenpool erstellt. Dann wird die Referenz dieses Strings im Konstantenpool zurückgegeben. -------------------------- --------------- -----------------------
Daher, solange es sich um äquivalente String-Objekte handelt
, die Verwendung der intern()-Methode gibt die gleiche String-Referenz im Konstantenpool zurück
Diese äquivalenten String-Objekte können also mit == nach intern()
String.intern() in JDK6
PermGen ist ein wichtiger Bereich mit fester Größe, der zum Speichern geladener Klasseninformationen und des String-Pools verwendet wird
---------------------------------- ------------ -------------------------------------- ----Beim Ausführen der intern()-MethodeJdk7 hat den Konstantenpool aus dem PermGen-Bereich in den Java-Heap-Bereich verschobenWenn im Konstantenpool keine entsprechende Zeichenfolge vorhanden ist, erstellt die JVM eine entsprechende Zeichenfolge im Konstantenpool
Daher können Sie die intern()-Methode nicht für unkontrollierte Laufzeitzeichenfolgen (z. B. Benutzereingabeinformationen usw.) verwenden.
und gibt dann einen Verweis auf die Zeichenfolge zurück
Darüber hinaus gibt die JVM speichert automatisch eine vorherige Kopie in der Konstantenpool-Sammlung verwendeter Zeichenfolgen
Das Hauptproblem bei der Verwendung der intern()-Methode in Jdk6 besteht darin, dass der Konstantenpool in PermGen (permanente Generation) gespeichert wird
Hinweise:
Zunächst einmal PermGen ist ein Bereich mit fester Größe, im Allgemeinen auf verschiedenen Plattformen. Die Standardgröße von PermGen ist ebenfalls unterschiedlich,
Sie liegt ungefähr zwischen 32 MB und 96 MB.Andernfalls kann es zu einem PermGen-Speicherüberlauf kommen.
Zweitens wird das String-Objekt im Java-Heap gespeichert Der Java-Heap-Bereich ist derselbe wie PermGen und ist physisch isoliert.
Wenn daher interne Operationen an mehreren ungleichen Zeichenfolgenobjekten ausgeführt werden,
führt dies zu vielen doppelten Zeichenfolgen im Speicher, was zu Leistungsverlusten führt
String.intern() in JDK7
Beim Ausführen der internen Operation
Wenn die Zeichenfolge bereits im Konstantenpool vorhanden ist, wird die Zeichenfolgenreferenz direkt zurückgegebenAndernfalls Die Referenz des String-Objekts wird in den Konstantenpool kopiert und zurückgegebenDie Größe des Heap-Bereichs ist im Allgemeinen nicht begrenzt, sodass durch das Verschieben des Konstantenpools vom PremGen-Bereich in den Heap-Bereich die Verwendung des Konstantenpools nicht mehr eingeschränkt ist eine feste Größe
Darüber hinaus können Objekte im Konstantenpool, die sich im Heap-Bereich befinden, durch Müll gesammelt werden
Wenn die Zeichenfolge im Konstantenpool keinen Verweis mehr darauf hat, recycelt die JVM die Zeichenfolge
Sie können Folgendes verwenden: XX:StringTableSize-Parameter für virtuelle Maschinen zum Festlegen der Kartengröße des String-Pools Auf die erforderliche Zahl * 2 abbilden (Hash-Konflikte reduzieren)
Auf diese Weise können Sie nur String.intern() erstellen. Es erfordert konstante Zeit und
ziemlich wenig Speicher, um einen String im String-Pool zu speichern
Funktion von String.intern() Methode:
Seine Funktion besteht darin, die Zeichenfolge manuell in den Konstantenpool einzufügen
Das obige ist der detaillierte Inhalt vonWelche Funktion hat die Methode String.intern() in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!