Размер указателя. Насколько велика ссылка на объект?

Вопрос заканчивается после первой горизонтальной линии, остальные - дополнительная информация.

Вопрос прост, каков размер, который использует ссылка в Androids Java VM?

Под этим я подразумеваю:

Если мы имеем

String str = "Watever";

Мне нужно, что str принимает, а не "Watever". - "Watever" - это то, что сохраняется в местоположении, на которое указывает указатель (или ссылка), который str, указывает на.

Кроме того,

Если мы имеем

String str = null;

сколько памяти оно потребляет? Это то же самое, что и другое str??

теперь, если мы имеем:

Object obj[] = new object[2];

сколько потребляет obj и сколько потребляет obj[1] и obj[2]?


Причиной для квестона является следующее: (в случае, если кто-то может что-то рекомендовать).

Я работаю над приложением, которое управляет многими фотографиями, загружаемыми из Интернета. Я начал хранить эти фотографии на "банке" (который состоит из списка изображений).

При отображении этих изображений в галерее я искал изображение в списке (SLOW), а затем, если тогда изображения не было, я показывал временное загружаемое изображение до загрузки изображения.

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

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

Я прочитал: "Чтобы сбалансировать эффективность времени и пространства, хэш-таблица должна быть примерно наполовину заполнена", но это делает столкновения наполовину (не подходит для потока пользовательского интерфейса). Это заставляет меня думать о том, что у вас очень длинная хеш-таблица (по сравнению с количеством сохраненных изображений) и больше памяти (с меньшим количеством свободного VMHeap).

Прежде чем определять размер хеш-таблицы, я хотел бы знать, сколько памяти он будет потреблять, чтобы не вызывать беспокойство.

Я знаю, что размер хеш-таблицы может быть очень мал по сравнению с памятью, которую могут потреблять изображения, но я хотел убедиться, что я не потребляю больше памяти, чем необходимость.


Прежде чем задавать этот вопрос, я искал, между другими местами, в

Насколько велика ссылка на объект в Java и какая именно информация содержит?

размер ссылочного типа в java

Hashing Tutorial

(Да, я знаю, что два из этих мест противоречат друг другу, это часть причины вопроса).


Если вы по какой-либо причине ничего не понимаете или хотите получить дополнительную информацию, пожалуйста, оставьте комментарий, я отвечу, как только смогу.

Чем ты много говоришь.

Ответ 1

Ссылка на объект или массив занимает одно 32-битное слово (4 байта) на 32-битной виртуальной машине JVM или Davlik. A null занимает то же место, что и ссылка. (Он должен, потому что нуль должен быть помещен в слот с типизированным типом, то есть поле экземпляра, локальную переменную и т.д.)

С другой стороны, объект занимает минимум 2 32-битных слова (8 байтов), а массив занимает минимум 3 32-битных слова (12 байтов). Фактический размер зависит от количества и типов полей для объекта, а также от количества и типов элементов для массива.


Для 64-разрядной JVM размер ссылки составляет 64 бита, если вы не настроили JVM на использование сжатых указателей:

-XX: + UseCompressedOops Позволяет использовать сжатые указатели (ссылки на объекты, представленные как 32-разрядные смещения вместо 64-разрядных указателей) для оптимизированной 64-разрядной производительности с размерами кучи Java менее 32 гб.


Я думаю, что это вопрос вашего вопроса.

Прежде чем определять размер хеш-таблицы, я хотел бы знать, сколько памяти он будет потреблять, чтобы не вызывать беспокойство.

Если вы выделяете HashMap или Hashtable с большим начальным размером, большая часть пространства будет занята массивом хэшей. Это массив ссылок, поэтому размер будет 3 + initialSize 32-битных слов. Маловероятно, что это будет значительным... если вы не сделаете свою оценку размера радикально неправильной.

Тем не менее, я думаю, что вы, вероятно, слишком беспокоитесь о производительности. Если вы сохраняете объекты по умолчанию HashMap или Hashtable по умолчанию, класс будет автоматически изменять размер хэш-таблицы по мере ее увеличения. Таким образом, при условии, что ваши объекты имеют приличную хэш-функцию (не слишком медленную, а не хеширование всего до небольшого числа значений), хеш-таблица не должна быть прямой проблемой производительности ЦП.

Ответ 2

Ссылки почти бесплатны. Тем более, что по сравнению с изображениями.

Наличие нескольких столкновений на карте не является реальной проблемой. Коллизии можно решить гораздо быстрее, чем линейный поиск по списку элементов. Тем не менее, двоичный поиск через отсортированный список элементов был бы хорошим способом уменьшить использование памяти (по сравнению с Картой).

Я могу поручиться за эффективность меньших начальных размеров для Карт. Недавно я написал программу, которая создает структуру Trie из 170000 английских слов. Когда я установил начальный размер до 26, у меня не хватило бы памяти к тому времени, когда я добрался до слов, начиная с R. Сократив его до 5, мне удалось создать карты без проблем памяти и выполнить поиск по дереву (со многими столкновений) эффективно не время.

[Edit] Если ссылка 32-битная (4 байта), а среднее изображение составляет около 2 мегабайт, вы можете разместить 500000 ссылок в том же пространстве, что и одно изображение. Вам не нужно беспокоиться о ссылках.