如何通过VisualVM从堆转储中获取对象的地址?

时间:2018-09-28 12:34:21

标签: java

现在,如果我想从堆转储中转储大字符串或char []。
我首先从heap analyzer获取地址,然后使用

将其转储到磁盘
chars = heap.findObject("0x1111111")
var writer = new java.io.FileWriter("D:/temp/oql/chars.txt");
for (var i = 0; i < chars.length; i++) {
    writer.write(chars[i]);
}
writer.close()

但这很烦人。
我需要使用两种工具来做一件事情,浪费时间和内存。

visualVM提供的不是对象地址,而是索引:
enter image description here

因此,如果我不想打开Heap analyzer,我将使用:

filter(heap.objects('char[]'),
 function(it, index) {
  if (index == 710394) {
      var writer = new java.io.FileWriter("D:/temp/oql/chars.txt");
      for (var i = 0; i < it.length; i++) {
          writer.write(it[i]);
      }
      writer.close();
      return true;
  }
  return false;
})

但是当索引很大时,它的速度很慢。

我检查OQL以查看是否可以使用索引,但找不到。
因此,我可以通过VisualVM(如现在的索引)直接获取地址,还是通过其他任何简单转储到磁盘的方式获取地址。

0 个答案:

没有答案