【问题标题】:Trouble with OQL 'unique' function of 'jhat' in Java 1.6.0_24Java 1.6.0_24 中“jhat”的 OQL“唯一”功能问题
【发布时间】:2011-08-26 16:18:11
【问题描述】:

这是我发布的第一个问题。我有一个相当复杂的 OQL 查询,它列出了我们包中加载的类的静态字段。我在针对 Java 1.6.0_24 的“jhat”运行查询时看到的一个问题是“unique”函数没有按预期工作。我期待

select unique(['a', 'b', 'c', 'a'])

返回 ['a', 'b', 'c'] 而是返回 ['a'], wtf?

如果有人感兴趣,实际的完整查询是(将“com.mydomain”替换为您喜欢的内容):

select cl.name + ' -- ' + unique(map(filter(referees(cl), "classof(it).name != 'java.lang.Class' && classof(it).name != 'java.lang.String' && classof(it).name != 'sun.misc.Launcher$AppClassLoader' && classof(it).name != 'java.security.ProtectionDomain' && classof(it).name != '[Ljava.security.cert.Certificate;' && classof(it).name != 'sun.plugin2.applet.JNLP2ClassLoader'"), "classof(it).name")).join(', ')
from instanceof java.lang.Class cl
where /com.mydomain./(cl.name) && ! /com.mydomain.xs.protobuf./(cl.name)
&& length(filter(referees(cl), "classof(it).name != 'java.lang.Class' && classof(it).name != 'java.lang.String' && classof(it).name != 'sun.misc.Launcher$AppClassLoader' && classof(it).name != 'java.security.ProtectionDomain'")) > 0;

【问题讨论】:

  • 它似乎将最后一个元素返回为:“select unique(['a', 'b', 'a', 'q'])" 返回 ['q']

标签: java jhat oql


【解决方案1】:

默认情况下,unique 在对象的objectid 上唯一,这适用于实际跟踪的对象,但对于字符串,它返回 null。因此,只保留最后一个字符串(因为所有字符串都有非唯一的 objectid 值)。

你有两个选择:

  1. 在跟踪的对象上唯一,而不是它们的名称:

    map(unique(filter(map(referees(cl), classof), "it.name != ...")), "it.name")
    
  2. 指定要唯一化的“函数”,以便它适用于字符串:

    unique(['a', 'b', 'c', 'a'], 'it')
    

    这将导致字符串本身是唯一的。

【讨论】:

  • 谢谢!我正在按照 (2) 的思路进行思考,但没有完全理解:“unique(map(['a', 'b', 'c', 'q'], 'it'))” 现在使得感觉。
猜你喜欢
  • 2012-02-08
  • 2021-09-15
  • 2011-08-21
  • 2012-01-17
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
  • 1970-01-01
相关资源
最近更新 更多