Java 1.6.0_24中的“jhat”的OQL“独特”功能问题

时间:2011-05-16 18:35:57

标签: java jhat oql

这是我发布的第一个问题。我有一个相当复杂的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;

1 个答案:

答案 0 :(得分:1)

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

您有两种选择:

  1. 取消跟踪被跟踪对象,而不是名称:

    map(unique(filter(map(referees(cl), classof), "it.name != ...")), "it.name")
    
  2. 指定要取消引用的“功能”,以便它适用于字符串:

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

    这将导致字符串本身不受限制。