Какая структура данных использует больше памяти? - PullRequest
0 голосов
/ 10 февраля 2009

Какой тип структуры данных использует больше памяти?

  • Hashtable
  • Hashmap
  • ArrayList

Не могли бы вы дать мне краткое объяснение, какой из них менее подвержен утечке памяти?

Ответы [ 9 ]

15 голосов
/ 10 февраля 2009

... какой использовать для предотвращения утечки памяти

Ответ: все из них и нет из них.

Утечка памяти связана не со структурой данных, а с тем, как вы их используете.

Количество используемой памяти не имеет значения, когда вы стремитесь избежать «утечки памяти».

Лучшее, что вы можете сделать: когда вы обнаружите объект больше не будет использоваться в приложении, вы должны удалить его из коллекции (не только тех, которые Вы перечислили, но любой другой, который вы могли бы использовать: список, карта, набор или даже массивы).

Таким образом сборщик мусора сможет освободить память, используемую этим объектом.

Вы можете взглянуть на эту статью "Как работает сборщик мусора" для более подробного объяснения того, как Java освобождает память от объектов, которые он использует.

Edit:

Существуют и другие структуры данных в Java, которые помогают в управлении ссылками, например WeakHashMap , но это можно рассматривать как «дополнительные темы».

3 голосов
/ 10 февраля 2009

Скорее всего, вам стоит использовать Коллекцию, которая соответствует вашим текущим потребностям. В наиболее распространенных случаях, если вам нужен List, используйте ArrayList, а если вам нужен Map, используйте HashMap. Для учебника, например, см. http://java.sun.com/docs/books/tutorial/collections/

Когда ваш профилировщик показывает вам, что существует фактическая утечка памяти, связанная с использованием Java Collections, затем что-то с этим делают.

1 голос
/ 10 февраля 2009

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

  • Есть несколько реализаций коллекции с использованием примитивов (список здесь ). Поиграл немного с trove4j, и нашел несколько меньше след памяти (пока вы разумеется, имея дело с примитивами).
  • Если вы имеете дело с большими коллекции, вы, вероятно, получите больше удар за доллар, с точки зрения уменьшение объема памяти, на оптимизировать объекты, которые вы держа. Ведь у тебя много больше из них, иначе вы бы не нужна коллекция, верно?
  • Некоторые коллекции, естественно, меньше (например, LinkedList будет немного меньше, чем ArrayList), но разница, вероятно, будет уменьшена из-за различий в том, как они используются)
  • Большинство java-коллекций могут быть измерены вручную - вы можете установить для своего массива из 100 элементов инициализацию до 100 элементов, и вы можете настроить свои карты так, чтобы они оставляли меньше свободного места за счет снижения производительности. Все в javadocs.

В конечном счете, самое простое, что нужно сделать, это проверить себя.

1 голос
/ 10 февраля 2009

Ваш вопрос крайне не указан, поскольку указанные вами конкретные структуры данных не имеют сопоставимой структуры.

HashMap / HashTable сравнимы, так как они оба функционируют как карты (ключ -> поиск значений). ArrayLists (и списки в целом) не.

На часть HashMap / HashTable легко ответить, так как они в значительной степени идентичны (основное отличие - нулевые ключи), но первая не синхронизирована, а вторая - таким образом, HashMap, как правило, будет быстрее (при условии, что синхронизация не требуется) Современные JVM довольно быстро справляются с бесконтрольными блокировками, хотя в микропроцессоре разница будет небольшой.

0 голосов
/ 29 апреля 2009

Как уже отмечали другие, ваш вопрос недостаточно конкретизирован.

Тем не менее, иногда реализация на основе ArrayList может заменить реализацию на основе HashMap (я бы вообще не рассматривал Hashtable, она устарела). Возможно, вам придется искать ArrayList линейно, но для небольших списков, которые все еще могут быть достаточно быстрыми, и ArrayList потребуется меньше памяти (для тех же данных), потому что у него меньше накладных расходов.

0 голосов
/ 10 февраля 2009

java.util.Collection хранит ссылки на объекты.

java.util.Map хранит ссылки на экземпляры Map.Entry, которые содержат ссылки на ключи и объекты.

Таким образом, java.util.Collection, содержащая N ссылок на объекты, потребует меньше памяти, чем java.util.Map, хранящий те же N ссылок, поскольку карта также должна указывать на ключи.

Производительность при чтении и записи различается в зависимости от реализации каждого из этих интерфейсов.

Я не вижу java.util.Collection, аналогичной WeakHashMap. Я бы прочитал об этом классе, если вы беспокоитесь о сборке мусора и утечке памяти.

0 голосов
/ 10 февраля 2009

Хеш-таблицы (будь то HashMap или HashTable) занимают немного больше памяти, чем они используют для хранения информации.

Производительность хеширования имеет свою цену.

0 голосов
/ 10 февраля 2009

Вы не сравниваете подобное с: HashMap и Hashtable реализуют интерфейс Map, а ArrayList реализует интерфейс List.

При прямом сравнении между Hashtable и HashMap, HashMap, вероятно, обеспечит лучшую производительность, поскольку Hashtable синхронизируется.

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

0 голосов
/ 10 февраля 2009

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

В Java это не имеет значения, поскольку сборка мусора выполняется автоматически, и вам не нужно беспокоиться об утечках памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...