3

I have tried:

select sort(obj.displayName, 'lhs < rhs') from my.org.BusinessClass obj

and

select sort(obj.displayName, 'lhs.toString() < rhs.toString()') from my.org.BusinessClass obj

Both give me character array results, but none of them are sorted by String. I think it's sorting by object id.

I have also tried:

select sort(obj.displayName, lhs < rhs) from my.org.BusinessClass obj 
select sort(obj.displayName, lhs.toString() < rhs.toString()) from my.org.BusinessClass obj

But these result in errors because sort second argument is suppose to a string expression.

The examples on the VisualVM documentation are only for numbers: Analyzing a Heap Dump Using Object Query Language (OQL)

The class is structured as follows:

package my.org;
public class BusinessClass {
    private String displayName;
    // rest of class omitted for brevity 
}
4

2 回答 2

4

您可以使用以下查询对 OQL 中的字符串进行排序:

select sort(heap.objects('java.lang.String'), 'lhs.toString().localeCompare(rhs.toString())')

在您的情况下,使用此 OQL 查询按 displayName 对您的业务对象进行排序:

select sort(heap.objects('my.org.BusinessClass'), 'lhs.displayName.toString().localeCompare(rhs.displayName.toString())')

如果您想在输出中查看您的业务对象和实际 displayName,请使用此 OQL 查询:

select map(sort(heap.objects('my.org.BusinessClass'), 'lhs.displayName.toString().localeCompare(rhs.displayName.toString())'), 'toHtml(it)+" "+it.displayName.toString()')
于 2016-12-04T11:04:39.577 回答
0

这是我使用的解决方法:

  1. 增加 OQL 返回的最大行数
    1. (请参阅:增加 OQL 结果的最大大小
  2. 将未排序查询的结果复制并粘贴到文本文件中
  3. 使用 vim 或类似的文本处理器删除对象 id
  4. 使用 unix 排序
于 2016-12-02T19:59:28.687 回答