当前位置: 首页 > 面试题库 >

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

微生俊健
2023-03-14
问题内容

我正在对现有的Java软件进行内存分析。在oql中是否存在等效的sql’group by’,以查看具有相同值但不同实例的对象的数量。

通过s.toString()从java.lang.String的组中选择count(*)

我想获得一列重复的字符串以及重复的数量。这样做的目的是查看大量的案例,以便可以使用String.intern()对其进行优化。

例:

"foo"    100
"bar"    99
"lazy fox"    50

等等…


问题答案:

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



 类似资料:
  • 问题内容: 更新 :已添加 我想对我的ElasticSearch集群执行唯一计数。该集群包含约5000万条记录。 我尝试了以下方法: 第一种方法 在本节中提到: 预计算哈希通常仅在非常大和/或高基数的字段上有用,因为它可以节省CPU和内存。 第二种方法 在本节中提到: 除非您将Elasticsearch配置为使用doc_values作为字段数据格式,否则使用聚合和构面对堆空间的要求 非常 高。 我

  • 问题内容: 我正在用Java 7中的转义分析进行一些测试,以便更好地了解哪些对象可以进行堆栈分配。 这是我编写的用于测试堆栈分配的代码: 这是它在Linux上与Java 7一起输出的结果 我正在使用GC日志来了解是否在堆栈上分配了对象,这可能不是100%可靠的,但似乎给出了很好的提示。 基于输出,堆栈分配适用于test1,test3,test4和test6,不适用于test2和test5。我不明白

  • 我有一张excel表格,里面有一些时间值。这些值是格式化为字符串的持续时间。当我尝试对这些值求和时,结果是0,因为Excel不能对字符串求和。当我点击公式栏上的回车键时,它确实变成了一个时间,所以我计算出的总和是有效的。如何将单元格的值从字符串更改为时间值?我已经将日期格式设置为和 我从转换成秒的时间量开始,我将其转换成持续时间 然后我使用 然后我将单元格值设置为刚刚生成的字符串 然后我将设置为一

  • 问题内容: 我有以下形式的数据: 组内的非空值始终相同。我想对每个组(如果存在)的非空值进行一次计数,然后找到每个值的总数。 我目前正在以以下方式(笨拙和低效)进行此操作: 我敢肯定,有一种方法可以更干净地执行此操作,而无需使用循环,但是我似乎无法解决问题。任何帮助将非常感激。 问题答案: 我认为您可以使用: 的另一种解决方案,然后创建new by ,将其重塑为by和last :

  • 关联分析 关联分析是一种在大规模数据集中寻找有趣关系的任务。 这些关系可以有两种形式: 频繁项集(frequent item sets): 经常出现在一块的物品的集合。 关联规则(associational rules): 暗示两种物品之间可能存在很强的关系。 相关术语 关联分析(关联规则学习): 从大规模数据集中寻找物品间的隐含关系被称作 关联分析(associati analysis) 或者

  • 我试图分析我的Java applet的堆转储,它耗尽了堆空间,即使我增加堆大小,如本文所示。applet:Java堆空间 今天上午我做了一些堆转储(是的...它可能做数字转储),我试图用MAT和Visual VM1.3.5来分析它们。运行泄漏测试后,主要的怀疑对象是org.eclipse.jdt.internal.core.javaModelManager和org.eclipse.jst.jee.