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

时间:2018-01-22 17:32:08

标签: java heap visualvm heap-dump oql

我愿意将索引为StringBuilder的大827的值写入磁盘。我试图使用以下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的值?

1 个答案:

答案 0 :(得分:2)

您可以使用以下查询:

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;
})