Расширение Java Integer кеша - PullRequest
       21

Расширение Java Integer кеша

3 голосов
/ 14 октября 2010

Существует общий совет использовать Integer.valueOf(int) вместо new Integer(int) из-за кэширования.

В JDK 5+ вы действительно должны использовать valueOf, потому что Integer теперь кэширует Integer объекты между -128 и 127 и может возвращать вам один и тот же точный Integer(0) объект каждый раз вместо того, чтобы тратить строительство объекта на совершенно новом идентичном Integer объекте.

Как можно расширить диапазон?

Ответы [ 5 ]

12 голосов
/ 14 октября 2010

Вы можете использовать свойство java.lang.Integer.IntegerCache.high, чтобы увеличить размер этого кэша.
ex:

java -Djava.lang.Integer.IntegerCache.high=4096 SomeClass.class
1 голос
/ 08 марта 2014

Очевидно, что -XX: + AggressiveOpts устанавливает максимальное значение на 20000. См. Ответ на Насколько велик кэш Integer?

1 голос
/ 03 апреля 2011

Именно поэтому был добавлен целочисленный кеш :

[...] для поддержки семантики идентификатора объекта автобокса для значений от -128 до 127 (включительно), как того требует спецификация языка.

Если вы профилировали свое приложение и заметили, что создание объектов Integer является горячей точкой, то непременно скопируйте код целочисленного кэша и напишите свой собственный с другимспектр.В противном случае ваше время было бы лучше потратить на поиск реальных горячих точек и их улучшение.

1 голос
/ 14 октября 2010

Расширение диапазона кэша может не дать вам того, что вы хотите, но если вам действительно нужно кэшировать больший диапазон, вы можете использовать этот код вместо Integer.valueOf (int). Вам просто нужно отрегулировать значения диапазона кэша до требуемого диапазона.

private static class IntegerCache 
{
    private IntegerCache(){}

    static final Integer cache[] = new Integer[-(-128) + 127 + 1];

    static 
    {
        for(int i = 0; i < cache.length; i++)
        cache[i] = new Integer(i - 128); 
    }
}

public static Integer valueOf(int i) 
{
    final int offset = 128;
    if (i >= -128 && i <= 127) // must cache 
    {
        return IntegerCache.cache[i + offset];
    }
    return new Integer(i);
}

Код от: http://www.owasp.org/index.php/Java_gotchas

1 голос
/ 14 октября 2010

Мои вопросы к вам:

1) Почему ваш код создает новые целочисленные объекты, причиняющие вам боль?Есть ли у вас профиль, которым можно поделиться, чтобы доказать, что слишком много целых чисел замедляет вашу работу?В общем, объединение объектов - ПЛОХАЯ идея.Вам нужен хороший случай, чтобы оправдать его.

2) Почему вы делаете новый Integer (int)?Если вы просто сохраните его как примитивный тип int, вы не только избежите «создания нового объекта».Вы не будете создавать объекты вообще.Автоматический бокс будет обрабатывать преобразование его в целое число, если оно понадобится вам позднее.

* Отказ от ответственности Я не использую ИЛИ ... Я пишу чувствительный к производительности код, но никогда не приходил в точку,Я бы вручную превратил примитив int в целое число.Я просто сохраняю как int всякий раз, когда это возможно, и позволяю JVM autobox, если это необходимо.

...