3

可能重复:
Java - 判断一个字符串是否被实习?

我想要一个已被 jvm 内部化的字符串列表,或者因为它们是字面的,是因为在它们上调用了方法intern 。我怎样才能生成它?

4

2 回答 2

1

我怎样才能生成它?

你不能在一个正在运行的程序中。没有用于迭代实习生字符串池的 API。


理论上你可以通过调试代理来做到这一点。它将涉及:

  1. 遍历可达对象以查找所有String实例。
  2. 对于每一个,测试 if str == str.intern()

但是,这个过程会很昂贵,并且会污染字符串池(permgen heap),其中包含大量不必要的字符串。此外,这仅在调试代理停止所有应用程序线程时才有效,因此应用程序不能使用这种方法检查自己的字符串池。

于 2011-05-25T23:09:14.700 回答
1

您可以获得所有实习字符串的总大小:

$ jmap -permstat 543
Attaching to process ID 543, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 19.1-b02-334
14584 intern Strings occupying 1603648 bytes.
finding class loader instances ..Warning: skipping invalid TLAB for thread t@44819
...
于 2011-05-25T22:47:31.457 回答