我在[{1}}的{{1}}部分找到了我的应用的个人资料,该方法Sampler
花费的时间最多。
但是这个方法的代码如下:
Java Visual VM
即。它只是调用另一种方法。
如何在调用者方法中花费这么多时间呢?
答案 0 :(得分:1)
首先证明JVisualVM准确地告诉你真相,并且正在正确地解释分析结果。
将这种典型的分析模式添加到可疑的慢速代码块中:
public int setDimensionValue(int index, int newValue) {
long start = System.currentTimeMillis();
int result = delegate.setValue(index, newValue);
long end = System.currentTimeMillis();
System.out.printf("Duration in %dms%n", end - start);
return result;
}
接下来,使用您自己的setValue方法将delgate.setValue与mock委托交换,并使用时序代码证明没有瓶颈。
接下来,将setValue方法中的计时放在委托中。
也许委托人在网络服务上执行具有延迟的操作,例如setValue?
观察JVisualVM中的线程状态。有什么阻碍吗?确保另一个线程没有synchronization lock委托,并且委托内的对象内没有锁定委托.setValue
从单元测试中调用setDimensionValue方法。单元测试框架还将为您提供准确的时序统计信息。当单元测试对象实例(如委托者)应该很容易被模拟时。
最后,确保在执行此方法时,CPU和堆空间看起来没有任何压力。