首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >引用对象的OQL语法?

引用对象的OQL语法?
EN

Stack Overflow用户
提问于 2015-12-24 19:06:00
回答 1查看 968关注 0票数 3

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

代码语言:javascript
复制
filter(heap.objects("java.lang.String"), "/hibernate\\.ejb\\.naming/(it.toString())")

它们显示如下:

代码语言:javascript
复制
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语法中的结果集中的单个对象?我的尝试失败了:

代码语言:javascript
复制
select heap.findObject("java.lang.String#34021")
select heap.findObject("#34021")
select heap.findObject("34021")
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-24 20:04:02

我可以在objectid(...)上使用技巧

代码语言:javascript
复制
map(filter(heap.objects("java.lang.String"),
           "/hibernate\\.ejb\\.naming/.test(it.toString())"),
    "{id: objectid(it), ref: it}")

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

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

代码语言:javascript
复制
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");
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34456943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档