Я использую 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;
}
}
Это побочный эффект зонда JDBC. Если вы отключите JDBC-зонд, это больше не будет.
В JProfiler 8 система зондов была переписана, чтобы быть более эффективной, и это уже не так.
setDouble(int, double)
будет создавать целочисленное значение в штучной упаковке. Я могу только предположить, что JProfiler автоматически заменяетsetDouble(int, double)
наsetDouble(Integer, Double)
.