Подтвердить что ты не робот

Как проверить содержимое пула строк?

Есть ли способ проверить, в настоящее время, какие строки находятся в пуле строк.

Можно ли программно перечислить все строки в пуле?

или

В любой среде IDE уже есть такие плагины?

4b9b3361

Ответ 1

Вы не можете получить доступ к пулу строк из Java-кода, по крайней мере, не в реализации Java-приложения HotSpot.

Пул строк в Java реализуется с помощью интернирования строк. Согласно JLS §3.10.5:

строковый литерал всегда ссылается на тот же экземпляр класса String. Это связано с тем, что строковые литералы, или, в более общем смысле, строки, которые являются значениями константных выражений (§15.28), "интернированы", чтобы обмениваться уникальными экземплярами, используя метод String.intern.

И согласно JLS §15.28:

Выражения константы времени компиляции типа String всегда "интернированы", чтобы обмениваться уникальными экземплярами, используя метод String.intern.

String.intern является нативным методом, как мы видим в его декларации в OpenJDK:

public native String intern();

Нативный код для этого метода вызывает функцию JVM_InternString.

JVM_ENTRY(jstring, JVM_InternString(JNIEnv *env, jstring str))
    JVMWrapper("JVM_InternString");
    JvmtiVMObjectAllocEventCollector oam;
    if (str == NULL) return NULL;
    oop string = JNIHandles::resolve_non_null(str);
    oop result = StringTable::intern(string, CHECK_NULL);
    return (jstring) JNIHandles::make_local(env, result);
JVM_END

То есть, интернирование строк выполняется с использованием собственного кода, и нет Java API для прямого доступа к пулу строк. Тем не менее, вы можете написать собственный метод самостоятельно для этой цели.