visualvm如何在Java Visual VM中解释大型自时结果?
尝试评测我的应用程序时,我在Java Visual VM
的Sampler
部分发现,该方法MyClass#setDimensionValue(int)
花费的时间最多
但该方法的代码如下所示:
public int setDimensionValue(int index, int newValue) {
return delegate.setValue(index, newValue);
}
也就是说,它只是调用另一个方法
那么,它怎么能在调用方方法中花费这么多时间呢
# 1 楼答案
首先证明JVisualVM准确地告诉了您真相,并且您正确地解释了分析结果
将这种典型的分析模式添加到可疑的慢代码块:
接下来,交换德尔盖特。用mock委托和你自己的setValue方法以及计时代码证明没有瓶颈
接下来,在委托内的setValue方法中放入计时
也许委托人执行的操作有延迟,比如Web服务上的setValue
观察JVisualVM中的线程状态。有什么阻碍吗?确保另一个线程没有synchronization lockon委托,并且委托内的调用堆栈中的对象没有锁。设定值
从单元测试调用setDimensionValue方法。单元测试框架还将为您提供准确的计时统计数据。当单元测试对象时,delegator之类的实例应该很容易被模仿
最后,确保在执行此方法时,CPU和堆空间看起来没有压力