Kara za wykonanie String.intern ()

Wiele osób mówi o zaletach wydajności String.intern (), ale jestem bardziej zainteresowany tym, jaka może być kara za wydajność.

Moje główne obawy to:

Koszt wyszukiwania: Czas, który intern () musi obliczyć, jeśli ciąg zmienny istnieje w puli stałych. W jaki sposób ta skala kosztów odpowiada liczbie ciągów w tej puli?Synchronizacja: oczywiście pula stała jest współdzielona przez całą maszynę JVM. Jak zachowuje się ta pula, gdy intern () jest wielokrotnie wywoływany z wielu wątków? Ile blokuje? Jak skala wydajności z rywalizacją?

Jestem zaniepokojony tymi wszystkimi rzeczami, ponieważ obecnie pracuję nad aplikacją finansową, która ma problem z wykorzystaniem zbyt dużej ilości pamięci z powodu powielonych ciągów. Niektóre ciągi w zasadzie wyglądają jak wyliczone wartości i mogą mieć ograniczoną liczbę potencjalnych wartości (np. Nazwy walut („USD”, „EUR”)) istnieją w ponad milionie kopii. String.intern () wydaje się w tym przypadku bezmyślnym, ale martwię się o koszty synchronizacji wywołania intern () za każdym razem, gdy gdzieś przechowuję walutę.

Ponadto niektóre inne typy łańcuchów mogą mieć miliony różnych wartości, ale wciąż mają dziesiątki tysięcy kopii każdego z nich (takich jak kody ISIN). W związku z tym obawiam się, że internowanie miliona łańcuchów spowolniłoby w zasadzie metodę intern (), a nawet zepsuło moją aplikację.

questionAnswers(4)

yourAnswerToTheQuestion