显示 Java 上最大字符串和字符数组内容的命令 6. 如何?

Command to show the content of biggest strings and char arrays on Java 6. How?

我正在尝试找到一种方法来 return Java 堆中最大的 Stringchar[] 的内容,使用一些 java 的工具。我正在使用 Java 6.

我正在处理一个存在内存问题的应用程序。大多数问题来自为 JPA Hibernate(版本 3.3.0)生成的查询创建的 String 和 Char 数组。

我可以使用jmap工具来显示高内存消耗:

jmap -histo:live <PID_OF_JAVA_PROCESS> | head -n 20

然后打印类似的东西(第一个是 char[]):

num     #instances         #bytes  class name
----------------------------------------------
   1:       3286152     1412140072  [C
   2:      10198187      239513896  [Ljava.lang.String;
   3:       3937983      126015456  java.lang.String
   4:        662242       47550936  [[Ljava.lang.String;

我可以使用 Eclipse Memory Analyzer 一一查看内部字符数组和字符串的内容。但这不是富有成效的。

我想让这些信息更简单,使用一些 java 工具来获取关于这个字符串和字符数组的所有信息并保存在一些文本文件中。

有了这些信息,我可以看到整个场景并优先处理有问题的查询。

谢谢!

使用 JVisualVM,这很容易。 运行 您的程序然后启动 JVisualVM。 然后在 JVisualVM 的进程浏览器中,识别您的 Java 进程并右击 select "Head Dump",它将创建程序使用的 HEAP 的转储。

在进程浏览器中输入生成的Head节点,然后点击"classes"选项,就会有classes.

搜索 char[] class 名称并双击它,您将在实例 table 中找到您搜索的信息(您的 HEAP 中 char[] 的所有实例)。您可以对所有 table 进行排序。