visualvm - OQL 语法来引用一个对象?

标签 visualvm oql

我在 visualvm v1.3.8 中找到所需的对象:

filter(heap.objects("java.lang.String"), "/hibernate\\.ejb\\.naming/(it.toString())")

它们显示为:

java.lang.String#32669 - hibernate.ejb.naming_strategy_delegator
java.lang.String#34021 - hibernate.ejb.naming_strategy
java.lang.String#39522 - hibernate.ejb.naming_strategy_delegator

如何在 OQL 语法中引用结果集中的单个对象?我的尝试失败了:

select heap.findObject("java.lang.String#34021")
select heap.findObject("#34021")
select heap.findObject("34021")

最佳答案

我可能会使用 objectid(...) 技巧:

map(filter(heap.objects("java.lang.String"),
           "/hibernate\\.ejb\\.naming/.test(it.toString())"),
    "{id: objectid(it), ref: it}")

然后使用 heap.findObject(4077522088) 之类的语法重用 id

UPDATE 2022 似乎 VisualVM 分别且一致地枚举每种类型,因此 heap.objects("...", false) 的迭代应该导致正确的对象:

function objectnum(clazz, num) {
  if (typeof clazz !== 'string') { return undefined; }
  if (Math.floor(num) !== num) {
     var split = clazz.split("#");
     if (split.length != 2) { return undefined; }
     clazz = split[0];
     num = parseInt(split[1]);
  }
  if (num < 1) { return undefined; }
  var iter = heap.objects(clazz, false);
  var i = 0;
  while (iter.hasMoreElements()) {
    i += 1;
    var next = iter.nextElement();
    if (num === i) { return next; }
  }
  return null;
}

// Usage:
objectnum("byte[]#123");
objectnum("char[]", 456);
objectnum("java.lang.String#789");

关于visualvm - OQL 语法来引用一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34456943/

相关文章:

java - jtop cpu 秒

java - 如何在 MAT Eclipse 中的 OQL 中使用 "AND operator (&&)"

visualvm - 使用 OQL 进行字符串搜索

java - VisualVM 1.3.7 无法从 GlassFish 获取 Java Web 应用程序列表

java - 显示分配堆栈跟踪时防止程序崩溃

java - 我正在尝试执行 jql 查询,但出现错误

java - 使用 MAT 时在 OQL 结果中显示字符串内容

java - VisualVM 1.3.8 OQL - TypeError : [RegExp/java. lang./] 不是函数

java - JFreeChart 堆空间

java - 为什么 VisualVM Profiler 不能分析我的应用程序?