Leistungsstrafe von String.intern ()

Viele Leute sprechen über die Leistungsvorteile von String.intern (), aber ich bin tatsächlich mehr daran interessiert, wie hoch die Leistungseinbußen sein könnten.

Meine Hauptanliegen sind:

Kosten suchen: Die Zeit, die intern () benötigt, um herauszufinden, ob die internierbare Zeichenfolge im Konstantenpool vorhanden ist. Wie skaliert dieser Preis mit der Anzahl der Zeichenfolgen in diesem Pool?Synchronisation: Offensichtlich wird der konstante Pool von der gesamten JVM gemeinsam genutzt. Wie verhält sich dieser Pool, wenn intern () immer wieder von mehreren Threads aufgerufen wird? Wie viel sperrt es? Wie skaliert die Leistung mit der Konkurrenz?

Ich mache mir wegen all dieser Dinge Sorgen, weil ich gerade an einer Finanzanwendung arbeite, bei der das Problem besteht, dass aufgrund von doppelten Zeichenfolgen zu viel Speicher verwendet wird. Einige Zeichenfolgen sehen im Grunde genommen wie Aufzählungswerte aus und können nur eine begrenzte Anzahl potenzieller Werte (z. B. Währungsnamen ("USD", "EUR")) aufweisen, die in mehr als einer Million Exemplaren vorhanden sind. String.intern () scheint in diesem Fall ein Kinderspiel zu sein, aber ich mache mir Sorgen über den Synchronisationsaufwand, wenn ich intern () jedes Mal anrufe, wenn ich irgendwo eine Währung speichere.

Darüber hinaus können einige andere Arten von Zeichenfolgen Millionen verschiedener Werte aufweisen, von denen jedoch immer noch Zehntausende Exemplare vorhanden sind (z. B. ISIN-Codes). Für diese bin ich besorgt, dass das Internieren einer Million Zeichenfolgen die intern () -Methode im Grunde so verlangsamt, dass meine Anwendung blockiert wird.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage