我愿意将索引为 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;
})
但是,什么也没有写。我现在已经存在构建器,因为我已经检查过它:
结果似乎在索引为 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;
})
关于java - 无法在 VisualVM 的堆转储中访问 StringBuilder 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48387170/