Как сделать свою память о приложении Java эффективной?

StackOverflow https://stackoverflow.com/questions/789132

Вопрос

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

  • Используйте правильный тип данных
    • Избегайте java.lang.string, чтобы представлять другие типы данных
  • Избегайте дублированных объектов
    • Используйте перечисления, если значения известны заранее
    • Используйте пулы объектов
    • String.intern () (хорошая идея?)
  • Загружать/сохранить только те объекты, которые вам нужны

Я ищу общие ответы на программирование или специфические ответы на Java. Нет фанкового компилятора.

Редактировать:

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

Сценарии использования

  • Загрузите огромный файл CSV в память (преобразован в Pojos)
  • Используйте Hibernate, чтобы получить миллион записей из базы данных

Резюме ответов:

  • Используйте рисунок в полусреднем весе
  • Копирование при записи
  • Вместо загрузки 10M объектов с 3 свойствами, более эффективно иметь 3 массива (или другую структуру данных) размером 10 м? (Может быть, больно манипулировать данными, но если у вас действительно мало памяти ...)
Это было полезно?

Решение

Вы не говорите, какие предметы вы хотите хранить, поэтому немного сложно предложить подробные советы. Однако некоторые (не исключительные) подходы, не в определенном порядке, являются:

  • Использовать схема втянутого веса где это возможно.
  • Кэширование на диск. Естьмногочисленные Кэш -решения для Java.
  • Есть некоторые споры о том, является ли String.Intern хорошей идеей. Видетьздесь по вопросу re. String.Intern () и объем дебатов вокруг его пригодности.
  • Использовать мягкий или же слабыйСсылки на хранение данных, которые вы можете воссоздать/перезагрузить спрос. Видетьздесь Для использования мягких ссылок с методами кэширования.

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

Другие советы

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

Вы можете посмотреть на изменение представления ваших данных, ESP, если ваши объекты невелики. Например, вы можете представлять таблицу данных как серию столбцов с массивами объектов для каждого столбца, а не один объект на строку. Это может сэкономить значительное количество накладных расходов для каждого объекта, если вам не нужно представлять отдельную строку. Например, таблица с 12 столбцами и 10 000 000 строк может использовать 12 объектов (по одному на столбец), а не 10 миллионов (по одному на строку)

Обеспечить хорошую нормализацию вашей объектной модели, не дублируйте значения.

Хим, и, если бы это только миллионы предметов, я думаю, я бы просто пошел на приличную 64 -битную виртуальную машину и много оперативной памяти;)

Нормальные «профилировщики» вам не помогут, потому что вам нужен обзор всех ваших «живых» объектов. Вам нужен анализатор свалки. Я рекомендую Aclipse Memory Analyzer.

Проверьте на дублированные объекты, начиная с струн. Проверьте, можете ли вы применять такие шаблоны, как полете, CopeonWrite, ленивая инициализация (Google будет вашим другом).

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

Создание памяти, эффективных Java, приложения: практика и проблемы

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

Я хочу добавить что -то к тому, что Питер Алреди сделал (не могу прокомментировать его ответ :() Всегда лучше использовать профилировщик памяти (проверка Java Memory Profiler), чем идти по интенсивному. 80% времени, на которую мы игнорируем, есть некоторые проблемы. Также классы сбора более подвержены утечкам памяти.

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

Причудливый: держите большую часть данных сжаты в оперативной памяти. Только расширяйте текущий рабочий набор. Если у ваших данных есть хорошая местность, которая может работать хорошо.

Используйте лучшие структуры данных. Стандартные коллекции в Java довольно интенсивны память.

Что такое лучшая структура данных

  • Если вы посмотрите на источник для коллекций, вы увидите, что если вы ограничиваете себя тем, как вы получаете доступ к коллекции, вы можете сэкономить пространство на элемент.
  • То, как коллекция обрабатывает выращивание, не подходит для больших коллекций. Слишком много копирования. Для больших коллекций вам нужен алгоритм на основе блоков, такой как Btree.

Потратьте некоторое время на знакомство и настройку Варианты командной строки VM, особенно те, что касаются сбора мусора. Несмотря на то, что это не изменит память, используемую вашими объектами, это может оказать большое влияние на производительность с интенсивными приложениями для памяти на машинах с большим количеством оперативной памяти.

  1. Assign null ценность для всех variables которые no longer использовал. Таким образом make it available for Garbage collection.
  2. De-reference the collections После того, как использование закончится, в противном случае GC не смеет их.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top