有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

visualvm如何在Java Visual VM中解释大型自时结果?

尝试评测我的应用程序时,我在Java Visual VMSampler部分发现,该方法MyClass#setDimensionValue(int)花费的时间最多

但该方法的代码如下所示:

    public int setDimensionValue(int index, int newValue) {
        return delegate.setValue(index, newValue);
    }

也就是说,它只是调用另一个方法

那么,它怎么能在调用方方法中花费这么多时间呢


共 (1) 个答案

  1. # 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;
    }
    

    接下来,交换德尔盖特。用mock委托和你自己的setValue方法以及计时代码证明没有瓶颈

    接下来,在委托内的setValue方法中放入计时

    也许委托人执行的操作有延迟,比如Web服务上的setValue

    观察JVisualVM中的线程状态。有什么阻碍吗?确保另一个线程没有synchronization lockon委托,并且委托内的调用堆栈中的对象没有锁。设定值

    从单元测试调用setDimensionValue方法。单元测试框架还将为您提供准确的计时统计数据。当单元测试对象时,delegator之类的实例应该很容易被模仿

    最后,确保在执行此方法时,CPU和堆空间看起来没有压力