使用oql进行Java堆分析:计算唯一字符串

使用oql进行Java堆分析:计算唯一字符串,第1张

使用oql进行Java堆分析:计算唯一字符串

以下内容基于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
数组来跟踪已包含哪些字符串。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5461977.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存