获取按类分组的从ArrayList引用的大小为1的对象数



我从应用程序中得到了一个堆转储,发现有大量的ArrayLists,其中只有一个对象。我知道如何获得这样的ArrayLists的列表,并显示所包含元素的类:

SELECT list.elementData[0] FROM java.util.ArrayList list WHERE (list.size = 1)

结果如下:

java.lang.String [id=0x7f8e44970]
java.lang.String [id=0x7f8e44980]
java.lang.String [id=0x7f8e44572]
java.io.File [id=0x7f8e43572]
...

我想要的是得到这样的东西:

Class             | count
=================================
java.lang.String  | 100
java.io.File      | 74
...

但我无法汇总结果,也无法对结果做任何其他处理。我在这里找到了如何将值传递给外部select,但我不知道如何在第一个select中使用*之外的任何其他内容。

SELECT * from OBJECTS
(SELECT OBJECTS list.elementData[0] FROM java.util.ArrayList list WHERE (list.size = 1))

VisualVM的OQL中没有group by,但您可以使用内置函数生成JavaScript片段,并在"OQL控制台"中运行:

var c = {};
/* Filter to show only the first occurence (max count) */
filter(
  /* Sort by occurences desc */
  sort(
    /* Count class instances */
    map(
      heap.objects("java.util.ArrayList"),
      function(list) {
        var clazz = 'null';
        if (list.size = 1 && list.elementData[0] != null) {
          clazz = classof(list.elementData[0]).name;
        }
        c[clazz] = (c[clazz] ? c[clazz] + 1 : 1);
        return { cnt:c[clazz], type:clazz };
      }
    ), 'rhs.cnt - lhs.cnt'
  ),
  function (item) {
    if (c[item.type]) {
      c[item.type] = false;
      return true;
    } else {
      return false;
    }
  }
);

输出是一个对象数组,如:

{
cnt = 3854.0,
type = null
}    
{
cnt = 501.0,
type = org.apache.tomcat.util.digester.CallMethodRule
}
{
cnt = 256.0,
type = java.lang.ref.WeakReference
}
{
cnt = 176.0,
type = sun.reflect.generics.tree.SimpleClassTypeSignature
}

最后,您可以再次调用map函数,将输出格式化为csv:形式的其他格式,例如per-empale

map(  
  filter(...),
  'it.type + ", " + it.cnt'
);

输出:

null, 3854    
org.apache.tomcat.util.digester.CallMethodRule, 501    
java.lang.ref.WeakReference, 256    
sun.reflect.generics.tree.SimpleClassTypeSignature, 176    
org.apache.tomcat.util.digester.CallParamRule, 144    
com.sun.tools.javac.file.ZipFileIndex$Entry, 141    
org.apache.tomcat.util.digester.ObjectCreateRule, 78

相关内容

  • 没有找到相关文章

最新更新