如何检查字符串池内容?

2022-09-01 14:44:35

有没有办法检查,当前字符串池中存在哪些字符串。

是否可以以编程方式列出池中存在的所有字符串?

任何IDE已经有这种插件?


答案 1

您无法从 Java 代码访问字符串池,至少在 Java VM 的 HotSpot 实现中无法访问。

Java 中的字符串池是使用字符串间歇实现的。根据 JLS §3.10.5

字符串文本始终引用类 的相同实例。这是因为字符串文本 (或者更一般地说,作为常量表达式的值的字符串 (§15.28) ) 被“暂存”,以便使用该方法共享唯一实例。StringString.intern

根据JLS §15.28

类型的编译时常量表达式始终是“暂存的”,以便使用方法共享唯一的实例。StringString.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 可以直接访问字符串池。但是,您可以自己编写一个本机方法来实现此目的。


答案 2