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

1

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

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

Как я могу предотвратить, чтобы 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;
    }
}
  • 0
    Стоит отметить, что JProfiler также считает, что метод setDouble(int, double) будет создавать целочисленное значение в штучной упаковке. Я могу только предположить, что JProfiler автоматически заменяет setDouble(int, double) на setDouble(Integer, Double) .
Теги:
jprofiler

1 ответ

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню