![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| UnicornMirage |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 15.11.2005 Репутация: 1 Всего: 1 |
любой массив объектов в Java хранит ссылки на объекты (какими они ни были эти объекты). отсюда следует что все проинициализированные массивы будут занимать одинаковый объем памяти? (разумеется учитывается только массив ссылок на объекты а не сами проинициализированные объекты):
сколько байт занимает одна ссылка? |
|||
|
||||
| redrick |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 547 Регистрация: 7.1.2004 Где: Москва Репутация: 3 Всего: 5 |
Вобщем, в спецификации VM это не оговаривается.
Одна ссылка может занимать сколько угодно, в зависимости от реализации. На практике, правда, это обычно 4 байта. А насчет одинаковости - опять же, скорее всего, но не обязательно, обязательно только то что по данной ссылке ты сможешь вытащить объект которым ее проинициализировал. -------------------- Имею Мнение Хрен Оспоришь |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
На 64-х битных машинах, скорее всего одна ссылка будет занимать 8 байт. А вообще это не сложно узнать:
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| powerOn |
|
||||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 47 Всего: 159 |
Простите, а зачем 4 раза сборщик мусора поднимать? |
||||
|
|||||
| redrick |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 547 Регистрация: 7.1.2004 Где: Москва Репутация: 3 Всего: 5 |
для пущей лучшести =) -------------------- Имею Мнение Хрен Оспоришь |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
А щоб наверняка
1. Вызов System.gc() не гарантирует, что сборщик будет реально вызван
2. Сборщик мусора инкрементальный, и может не все объекты очистить после первого вызова. Это уже обсуждалось, если найду кину ссылку. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| UnicornMirage |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 15.11.2005 Репутация: 1 Всего: 1 |
спасибо за ответы.
теперь отвечу почему я задал такой вопрос - например есть задача - где необходимо выделить своеобразный КЭШ для объектов произвольного типа. размер КЕШа заранее известен, также известен его максимально-возможный размер.. и в этом случае целесообразнее использовать заранее выделенный массив ссылок на объекты, чем использовать коллекции или списки, т.к. это будет работать гораздо быстрее? |
|||
|
||||
| redrick |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 547 Регистрация: 7.1.2004 Где: Москва Репутация: 3 Всего: 5 |
если у тебя в кеше лежат большие объекты (уж побольше чем 4 или 8 байт) то, думаю, колекция маленьких ссылок не испортит тебе жизнь
Вобщем незачем этот массив заранее выделять - ничего это не дает. -------------------- Имею Мнение Хрен Оспоришь |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
Быстрее будет заполняться, если вы заранее укажете правильный размер при создании коллекции. Потому что если не указывать, то любая коллекция будет расширяться по необходимости, а это означает создание нового внутреннего массива и копирование туда ссылок из старого. Этим во многих случаях можно пренебречь. Любая стандартная коллекция или лист требуют применения кастинга при извлечении обьектов. На это тоже не принято обращать внимания. Если же производительность - узкое место (редко, но бывает), то можно хранить в массиве конкретного типа. Не нужен кастинг и доступ по индексу - самый быстрый. |
|||
|
||||
| king |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 9.4.2006 Репутация: нет Всего: нет |
То что указатель занимает 4 байта понятно.. Но меня еще интересует другой вопрос : сколько занимает сам объект .. Немного модернизировал ваш код :
и получил : sizeof(Test[1038336]) = 20771840 bytes, 20.004930966469427 bytes/element т.е 20 байтов на элемент. Из них 4 идет на указатель.. а 16 на объект.. После эксперементов установил следующую закономерность : 0 полей - 8 байт 1 интовое поле - 16 байт 2 интовых поля - 16 байт 3 интовых поля - 24 байт 4 интовых поля - 24 байт 5 интовых поля - 32 байт т.е пустой клас занимает 8 байт, дальше идет выравнивание размера на 8 байт .. Это нормальное поведение для ява програмы? просто получается что большое количество объектов создавать не выгодно в яве.. в с++ можно делать структуры (это фактичнски те же самые классы) , но весят они именно столько , сколько от них ждешь Это сообщение отредактировал(а) king - 9.4.2006, 17:57 |
|||
|
||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 47 Всего: 159 |
А класс Test как выглядит?
|
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Это зависит от реализации JVM, но вообщем поведение нормальное. Если ты будешь создавать структуры с парой чисел типа int (например координаты), и создавать их миллионами. То с помощью структур это делать выгодней. Но если у тебя храняться сколько нибудь объемные данные, то 8 байт тебе погоды не сделают. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| king |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 9.4.2006 Репутация: нет Всего: нет |
|
||||
|
|||||
| powerOn |
|
||||||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 47 Всего: 159 |
В С++ структуры весять как сумма "масс" полей, но это структуры. В Java нет структур. В Java есть классы. А это означает, что любой класс, даже такой:
будет наследован от класса Object, который в свою очередь тоже требует определенного объема памяти. Это не недостаток языка, это его приемущество, поскольку если все классы имеют единого предка, то это означает возможность единого проведения операции для разных классов. Например, можно в колекцию добавлять объекты разных классов
, поскольку есть метод addElement(Object o). И не важно кто есть o. Это дает дополнительную гибкость. И вообще, если даже на MFC посмотреть, там тоже большинство классов унаследованны от CObject, который, вероятно, тоже занимает определенное место в памяти. |
||||||
|
|||||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |