Java 如何列出jvm中内部化的字符串?

Java 如何列出jvm中内部化的字符串?,java,permgen,Java,Permgen,可能重复: 我想要一个已经被jvm内部化的字符串列表,或者因为它们是文本,或者因为对它们调用的方法。如何生成它?您可以获得所有插入字符串的总大小,如下所示: $ 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 String

可能重复:


我想要一个已经被jvm内部化的字符串列表,或者因为它们是文本,或者因为对它们调用的方法。如何生成它?

您可以获得所有插入字符串的总大小,如下所示:

$ 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
...
我如何生成它

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


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

  • 遍历可访问对象以查找所有
    String
    实例
  • 对于每一个,测试str==str.intern()

  • 然而,这个过程将是昂贵的,并且将污染字符串池(permgen堆),因为大量字符串被不必要地占用。此外,这仅在调试代理停止所有应用程序线程时有效,因此应用程序无法使用此方法检查自己的字符串池。

    出于好奇:为什么需要它?这不是重复的。第一个问题是关于字符串的,第二个问题是关于获取列表的。我有一个perm gen空间内存不足的问题,看看添加了哪些字符串可以帮助我解释为什么perm gen在某个点上增长如此之快。我添加了另一个相关的问题,因为这一个问题没有被我预期的理解:问题是关于列表的,不是数字。理论上,这在小型应用程序上是可行的,但在大型应用程序的perm gen空间内存不足的情况下,它将失败。即使我增加了足够的perm gen空间,目标也是在不同点对列表进行比较。因为讲座修改了结果,所以不可能进行有效的比较。