如何列出已在JVM中内部化的字符串?

3

3
出于好奇,你为什么需要它? - Bozho
1
这不是重复的。第一个问题是关于字符串,第二个问题是关于获取列表。 - Guillaume Coté
我在永久代空间中遇到了内存不足的问题,查看添加的字符串可以帮助我了解为什么在某个特定点永久代会增长这么多。 - Guillaume Coté
我添加了另一个相关的问题,因为这个问题没有被理解成我想要的方式:https://dev59.com/82025IYBdhLWcg3wKSeP - Guillaume Coté
2个回答

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
...

1
问题是关于列表,而不是数字。 - Guillaume Coté

1

我该如何生成它?

在运行程序时无法生成。没有API可以迭代intern'd字符串池。


理论上,您可以通过调试代理来完成。 这将涉及以下步骤:

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

然而,这个过程会非常昂贵,并且会污染字符串池(permgen堆)中不必要的大量字符串。此外,只有在调试代理停止了所有应用程序线程时,才能使用此方法检查其自己的字符串池。


这在小型应用程序上理论上是可行的,但对于大型应用程序来说,它将在永久代空间中耗尽内存而失败。即使我足够增加永久代空间,目标是在不同点比较列表。由于讲座修改了结果,因此无法进行有效比较。 - Guillaume Coté

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接