Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> На самом ли деле Integer есть больше памяти, чем int? 
:(
    Опции темы
Royan
Дата 3.12.2007, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: 3
Всего: 15



Есть такая статья: http://www.javaworld.com/javaworld/javatip...130.html?page=2, написанная в бородатые времена. Я решил проверить какова ситуация на сегодняшний день. Во всех тестах использовалась java 1.6.0_02-b06

В общем, я модифицировал рассматриваемый в статье тест таким образом, чтобы вместо Object использовались (естественно поочередно) следующие классы

Код

class IntObj {
    Integer i = new Integer(0);
}

class IntPrim {
    int i = 0;
}

class IntObjPrim {
    Integer i = 0;
}


Вот результаты которые я получил


Цитата

[Lmain.IntObj;
'before' heap: 512168, 'after' heap: 3712168
heap delta: 3200000, {class main.IntObj} size = 32 bytes

[Lmain.IntPrim;
'before' heap: 512168, 'after' heap: 2112168
heap delta: 1600000, {class main.IntPrim} size = 16 bytes

 [Lmain.IntObjPrim;
'before' heap: 517304, 'after' heap: 2117304
heap delta: 1600000, {class main.IntObjPrim} size = 16 bytes


Пока никаких сюрпризов, теперь я несколько модифицировал описанные выше классы:


Код

class IntStatic {
    public static Integer ZERO = new Integer(0);
}

class IntObj {
    Integer i = new Integer(0);
    public IntObj() {
        i += IntStatic.ZERO; 
    }
}

class IntPrim {
    int i = 0;
    public IntPrim() {
        i += IntStatic.ZERO; 
    }
}


IntStatic добавлен для того чтобы его использование не сказывалось на общей картине. На этот раз я получил результаты, которые меня удивили

Цитата

[Lmain.IntObj;
'before' heap: 517320, 'after' heap: 2117320
heap delta: 1600000, {class main.IntObj} size = 16 bytes

[Lmain.IntPrim;
'before' heap: 512184, 'after' heap: 2112184
heap delta: 1600000, {class main.IntPrim} size = 16 bytes


Наконец я решил посмотреть какова ситуация с передачей параметров и более того сколько будет занимать поле Integer если его проинициализировать объектом Integer, а после вызвать на нем какой-нибудь метод, ну, например intValue()

Код

class IntObj {
    Integer i = new Integer(0);
    public IntObj(Integer i) {
        this.i = i; 
    }
}

class IntPrim {
    int i = 0;
    public IntPrim(Integer i) {
        this.i = i; 
    }
}

class IntObjOp {
    Integer i = new Integer(0);
    public IntObjOp(Integer i) {
        this.i = i;
        this.i.intValue();
    }
}

Понятно что потребовалось изменить и инициализацию объекта, а именно 

Код

object = new IntObj(IntStatic.ZERO);


Результаты тоже несколько удивили:


Цитата

[Lmain.IntObj;
'before' heap: 512184, 'after' heap: 2112184
heap delta: 1600000, {class main.IntObj} size = 16 bytes

[Lmain.IntPrim;
'before' heap: 512184, 'after' heap: 2112184
heap delta: 1600000, {class main.IntPrim} size = 16 bytes

[Lmain.IntObjOp;
'before' heap: 512184, 'after' heap: 2112184
heap delta: 1600000, {class main.IntObjOp} size = 16 bytes


Как видите JVM хитрая штука (кто в этом сомневался smile) - умеет оптимизировать не только арифметические операции над числовыми объектами, но также и передавать их как примитивный тип в качестве параметра, и что более удивительно, оптимизировать размер, когда вроде бы никаких причин на то быть не должно (последний вариант с классом IntObjOp)

Вот собственно и все.


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0390 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.