java - 无法在 VisualVM 的堆转储中访问 StringBuilder 的值

标签 java heap-memory visualvm heap-dump oql

我愿意将索引为 827 的大型 StringBuilder 的值写入磁盘。我正在尝试使用以下 OQL 来做到这一点:

map(heap.objects('java.lang.StringBuilder'),
 function(it, index) {
  if (index == 827.0) {
      var writer = new java.io.FileWriter("/Users/username/output/sb_0x" + it.id.toString(16) + ".txt");
      var chars = it.value;
      for (var i = 0; i < chars.length; i++) {
          writer.write(chars[i]);
      }
      writer.close();
  }
  return index;
})

但是,什么也没有写。我现在已经存在构建器,因为我已经检查过它:

All StringBuilder objects

结果似乎在索引为 99 的构建器之后被截断(即它适用于 99,但不适用于 100):

Truncated after 100

关于如何获取 ID 为 827 的 StringBuilder 的值有什么建议吗?

最佳答案

您可以使用以下查询:

filter(heap.objects('java.lang.StringBuilder'),
 function(it, index) {
  if (index == 827.0) {
      var writer = new java.io.FileWriter("/Users/username/output/sb_0x" + it.id.toString(16) + ".txt");
      var chars = it.value;
      for (var i = 0; i < chars.length; i++) {
          writer.write(chars[i]);
      }
      writer.close();
      return true;
  }
  return false;
})

关于java - 无法在 VisualVM 的堆转储中访问 StringBuilder 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48387170/

相关文章:

java - keystore 的 setkeyentity 的参数

java - LibGDX TextButton - 只要按住它,任何事件都会被重复调用吗?

java - "How to fix error ' 表达式的非法开始”- java

java - 即使使用工具,Java 中对象的内存地址

java - 执行线程转储时的 VisualVM 堆栈变量值

coldfusion - VisualVM 和 Coldfusion 8 : why no memory sampling available?

Java日期问题

java - 在 Java 堆之外分配的巨大内存

c++ - 当不使用new关键字但父对象在堆中时,对象内部的对象是否存储在堆栈或堆中?

java - 无法加载 MBeanServerBuilder : VisualVM