我有一个名为com.acmesoftware.shared.AbstractDerrivedBean.getDerivedUniqueId()的方法。当我对应用程序进行JProfiler时,这个方法getDerivedUniqueId()基本上被掩埋了80个方法,如预期的那样。代表应用程序中的每个bean调用该方法。我正在尝试将从此方法开始的CPU calltree记录到叶节点(即,排除的类之一)。
我尝试了以下但是没有产生预期的结果:
我原本只希望看到markForDeletion()下面的所有内容,但是我看到了所有内容但不包含getDerivedUniqueId(),这与我的预期目标相反。更糟糕的是,即使采样5ms,此触发器也将之前的运行时间从10分钟增加到“运行3小时后终止”。似乎触发器在开销之上增加了大量的开销。因此,即使我弄清楚如何正确启用触发器,增加的开销似乎也会使其失效。
我需要将录制限制为此方法的原因是:在5ms采样模式下运行时,应用程序将在10分钟内完成。当我在完整的仪器中运行它时,我已经等了3个小时,但仍然没有完成。因此,我需要在调用getDerivedUniqueId()之后打开完整的检测,并在退出getDerivedUniqueId()时暂停性能分析。
- 更新/编辑: 感谢Ingo Kegel的帮助。 我可能不清楚如何使用触发器。在下面的代码中,我在代码后面设置了触发器。我的期望是,当我使用以下配置的触发器对应用程序(采样和完整检测)进行JP配置时,如果boolean isCollectMetrics为false,我应该在过滤类中看到100%或99.9%的cpu。但事实并非如此。 CPU树似乎没有考虑触发器。 其次,当isCollectMetrics为true时,我期望的jprofiler调用树将以startProfiling()开头并以stopProfiling()结束。同样,情况也不是这样。
方法包含()是瓶颈。它最终调用了150个getDerivedUniqueId()中的一个。我试图找出哪个getDerivedUniqueId()导致性能下降。
public Inventory() { // constructor
super("DVD1");
DVD = new DVD[7];
DVD[0] = new MovieTitle ( "1", " Fast and Furious 6", 10, 15 );
DVD[1] = new MovieTitle ( "2", " The Matrix Reloaded", 8, 5 );
DVD[2] = new MovieTitle ( "3", " In Pursuit of Happiness", 8, 5 );
DVD[3] = new MovieTitle ( "4", " Darknet", 8, 5 );
DVD[4] = new MovieTitle ( "5", " Goonies", 8, 5 );
DVD[5] = new MovieTitle ( "6", " zzzz", 8, 5 );
DVD[6] = new MovieTitle ( "7", " AAaaaa", 15, 19.99 );
</code>
启用的触发器:
startProfiling触发器:
stopProfiling触发器:
我分别尝试了“开始录制”或“录制CPU”按钮以仅捕获调用树
答案 0 :(得分:0)
如果检测的开销很大,您应该优化过滤器。使用良好的过滤器,仪表开销可能非常小,
对于触发设置,正确的操作是: