当前位置: 首页 > 知识库问答 >
问题:

如何将JProfiler限制为子树

何德寿
2023-03-14

我有一个叫做com的方法。ACM软件。共享。AbstractDerrivedBean。getDerivedUniqueId()。当我JProfiler应用程序时,这个方法getDerivedUniqueId()实际上像预期的那样埋在了80个方法的深处。该方法代表应用程序中的每个bean调用。我试图记录CPU调用树,从这个方法开始,一直记录到叶节点(即,被排除的类之一)。

我尝试了以下方法,但没有达到预期效果:

  1. 在分析的目标方法之上找到一个方法,例如markForDeletion()
  2. 设置触发器以在getDerivedUniqueId()开始录制
  3. 将触发器设置为在markForDeletion()停止录制

我本以为只能看到MarkForDeletion()下面的所有内容,但我看到了所有内容,但没有包括getDerivedUniqueId(),这与我的预期目标相反。更糟糕的是,即使有5毫秒的采样,这个触发器也将之前的运行时间从10分钟增加到“我在运行3小时后终止”。看起来触发器在开销之上增加了大量开销。因此,即使我弄清楚如何正确启用触发器,增加的开销似乎也会使其无效。

我需要将录制限制为仅此方法的原因是:在5ms采样模式下运行时,应用程序在10分钟内完成。当我在完整的仪器中运行它时,我已经等了3个小时,但它仍然没有完成。因此,我只需要在调用getDerivedUniqueId()之后打开完整的插装,并在退出getDerivedUniqueId()时暂停分析。

--更新/编辑:感谢英戈·凯格尔的帮助。我可能不清楚如何使用触发器。在下面的代码中,我设置了触发器,如代码后面所示。我的期望是,当我使用以下配置的触发器配置应用程序(包括采样和完整插装)时,如果boolean isCollectMetrics为false,我应该在过滤类中看到100%或99.9%的cpu。然而,事实并非如此。CPU树似乎没有考虑触发器。其次,当isCollectMetrics为true时,我期望的jprofiler调用树将以startProfiling()开始,并以stopProfiling()结束。同样,情况也并非如此。

方法contains()是瓶颈。它最终调用了150个getDerivedUniqueId()中的一个。我试图找出哪个getDerivedUniqueId()导致了性能下降。

public static final AtomicLong doEqualContentTime = new AtomicLong();
public static final AtomicLong instCount = new AtomicLong();

protected boolean contentsEqual(final InstanceSetValue that) {

    if (isCollectMetrics) {

        // initialization code removed for clarity
        // ..........
        // ..........

        final Set<Instance> c1 = getReferences();
        final Set<Instance> c2 = that.getReferences();
        long st = startProfiling();    ///  <-------  start here
        for (final Instance inst : c1) {
            instCount.incrementAndGet();
            if (!c2.contains(inst)) {
                long et = stopProfiling();    ///  <-------  stop here
                doEqualContentTime.addAndGet(et - st);
                return false;
            }
        }

        long et = stopProfiling();    ///  <-------  stop here
        doEqualContentTime.addAndGet(et - st);
        return true;
    } else {
        // same code path as above but w/o the profiling. code removed for bravity.
        // ......
        // ......
        return true;
    }
}

public long startProfiling() {
    return System.nanoTime();
}

public long stopProfiling() {
    return System.nanoTime();
}

public static void reset() {
    doEqualContentTime.set(0);
    instCount.set(0);
}

共有1个答案

甄德寿
2023-03-14

如果插装的开销很大,则应该优化过滤器。使用良好的过滤器,仪器开销可能非常小,

对于触发器设置,正确的操作是:

  1. 选择CPU数据时“开始记录”
 类似资料:
  • 问题内容: 我想将用户限制在一个目录及其子目录中,但是“父目录”按钮允许他们浏览到任意目录。 我应该怎么做呢? 问题答案: 您可能可以通过设置自己的FileSystemView来实现。

  • 我有一个要求,我需要将搜索关键字应用于父实体(客户)的名称和状态,以及子实体 Order 的名称属性。 并在查询中包含子表,我正在执行以下操作 Hibernate正在生成下面的查询,但是我需要的是将order.name之类的比较添加到父块中。 我想要的是(lcase(order_.NAME)像?)在父块内。所以我想要的是以下内容 (this_名称)像? 或大小写(this_.状态) 像 ? 或大小

  • 问题内容: 如何将MySQL数据库中的user_account限制为特定表。例如: 我只想将“ RestrictedUser”限制为,并且将创建该表的其余表以供将来使用,并授予其访问权限。 问题答案: 假设用户没有当前权限,则可以执行以下操作 根据您希望授予用户的特权,您可以更改为其他内容,例如。 之后,请记住清除特权以使其生效。

  • 问题内容: 我对的能力了解得越多,我就越惊讶于它的作用。这是根据我对问题的回答(使用反射更改静态最终用于单元测试)改编而成的。 你可以做真正令人发指的事情: 大概是API设计者意识到了可滥用性,但是必须承认它具有合法的用途来提供它。所以我的问题是: 真正合法的用途是什么? Java是否可以被设计为一开始就没有这种需求? 这种设计的负面后果(如果有)是什么? 你只能限制合法使用吗? 只有通过吗? 它

  • 问题内容: 我如何从elasticsearch中获取所有结果,因为结果仅显示限制为10。我有一个查询,像: 我已将限制设置为15,但我不想使其无限,以便我可以获取所有数据,因为我的数据不断变化,并且我想获取所有数据,所以我无法设置限制。 问题答案: 您可以使用和参数浏览所有数据。这可能非常慢,具体取决于您的数据以及索引中有多少。 http://www.elastic.co/guide/zh-CN/

  • 问题内容: 我在AngularJS中使用ngChange来触发自定义函数,该函数将删除用户添加到输入中的所有字母。 问题是我需要定位触发的输入,以便删除输入的字母。我已经在Google上寻找了很长时间,并且对此一无所获。 我能做什么? 问题答案: 简单的方法 ,如果适用于您的用例,请使用type =“ number” : 另一种简单的方法: ng- pattern 也可用于定义正则表达式,以限制字