以下内容基于Peter Dolberg的回答,可以在VisualVM OQL控制台中使用:
var counts={};var alreadyReturned={};filter( sort( map(heap.objects("java.lang.String"), function(heapString){ if( ! counts[heapString.toString()]){ counts[heapString.toString()] = 1; } else { counts[heapString.toString()] = counts[heapString.toString()] + 1; } return { string:heapString.toString(), count:counts[heapString.toString()]}; }), 'lhs.count < rhs.count'), function(countObject) { if( ! alreadyReturned[countObject.string]){ alreadyReturned[countObject.string] = true; return true; } else { return false; } } );
首先使用
map()对所有String实例的调用,然后为每个String创建或更新
counts数组中的对象。每个对象都有一个
string和一个
count字段。
结果数组将为每个String实例包含一个条目,每个条目的
count值都比同一String的上一个条目大。然后将结果在
count字段上排序,结果看起来像这样:
{count = 1028.0,string = *null*}{count = 1027.0,string = *null*}{count = 1026.0,string = *null*}...
(在我的测试中,字符串
"*null*"是最常见的)。
最后一步是使用一个函数对它进行过滤,该函数对于每个String的首次出现都返回true。它使用
alreadyReturned数组来跟踪已包含哪些字符串。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)