Имя метода запускает автоматическую упаковку примитивов при профилировании с помощью JProfiler.

Я использую JProfiler 7.2.3 для профилирования распределения памяти в моем приложении. У меня есть классы с такими методами, как set(int, double) и setDouble(int, double). Эти два метода абсолютно идентичны, но JProfiler говорит, что последний метод создает упакованный объект Double, а первый — нет.

Следующий код демонстрирует проблему. При записи выделения памяти с помощью JProfiler при вызовах setDouble(int, double) создается 100 000 объектов Double, но в других идентичных методах объекты не создаются. Разница только в названии метода!

Как я могу предотвратить JProfiler от неправильного подсчета количества объектов Double без переименования метода setDouble? Почему JProfiler неправильно учитывает объекты Double?

public final class Test {
    public static void main(String[] args) throws java.io.IOException {
        Test test = new Test();

        for (int i = 0; i < 100000; i++)
            test.set(i, i);

        for (int i = 0; i < 100000; i++)
            test.setD(i, i);

        for (int i = 0; i < 100000; i++)
            test.setDestination(i, i);

        // JProfiler says this method creates boxed Double objects
        for (int i = 0; i < 100000; i++)
            test.setDouble(i, i);

        for (int i = 0; i < 100000; i++)
            test.setDoubleValue(i, i);

        // Don't terminate VM
        System.in.read();
    }

    private double[] values = new double[100000];

    public final void set(int i, double value) {
        values[i] = value;
    }

    public final void setD(int i, double value) {
        values[i] = value;
    }

    public final void setDestination(int i, double value) {
        values[i] = value;
    }

    public final void setDouble(int i, double value) {
        values[i] = value;
    }

    public final void setDoubleValue(int i, double value) {
        values[i] = value;
    }
}

person harvey    schedule 28.04.2014    source источник
comment
Стоит отметить, что JProfiler также считает, что метод setDouble(int, double) создаст коробочное целое число. Я могу только предположить, что JProfiler автоматически заменяет setDouble(int, double) на setDouble(Integer, Double).   -  person harvey    schedule 29.04.2014


Ответы (1)


Это побочный эффект зонда JDBC. Если вы отключите зонд JDBC, это больше не будет иметь место.

В JProfiler 8 система датчиков была переписана, чтобы сделать ее более эффективной, и это больше не так.

person Ingo Kegel    schedule 29.04.2014