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

Java 无法访问VisualVM堆转储中StringBuilder的值,java,heap,visualvm,heap-dump,oql,Java,Heap,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");

我愿意将索引为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;
})
map(heap.objects('java.lang.StringBuilder'),
功能(it、索引){
如果(指数=827.0){
var writer=new java.io.FileWriter(“/Users/username/output/sb_0x”+it.id.toString(16)+.txt”);
var chars=it.value;
对于(变量i=0;i
然而,什么都没有写。既然我已经检查过了,现在我知道建筑商已经存在了:

在使用索引
99
的生成器之后,结果似乎被截断(即,它适用于99,但不适用于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;
})
filter(heap.objects('java.lang.StringBuilder'),
功能(it、索引){
如果(指数=827.0){
var writer=new java.io.FileWriter(“/Users/username/output/sb_0x”+it.id.toString(16)+.txt”);
var chars=it.value;
对于(变量i=0;i
如果您能解释一下原始代码之间的区别以及为什么会有区别,那将更有帮助。