Подтвердить что ты не робот

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

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

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

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

Edit:

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

Использовать случаи

  • Загрузите огромный файл csv в память (преобразованный в POJO)
  • Используйте спящий режим для извлечения миллиона записей из базы данных.

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

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

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

Обычные "профайлеры" не помогут вам, потому что вам нужен обзор всех ваших "живых" объектов. Вам нужен анализатор дампа кучи. Я рекомендую Eclipse Memory Analyzer.

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

Ответ 6

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

Ответ 7

Я хочу добавить что-то к точке, которую сделал Peter alredy (не могу прокомментировать его ответ:() всегда лучше использовать профилировщик памяти (отметьте профилировщик java-памяти), чем на intution.80% времени, которое у этой рутины, которую мы игнорируем, имеет некоторые проблемы в этом. Кроме того, классы коллекции более подвержены утечкам памяти.

Ответ 8

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

Ответ 9

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

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

[лучшая структура данных]

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

Ответ 10

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

Ответ 11

  • Assign null значение для всех variables, которые используются no longer. Таким образом, make it available for Garbage collection.
  • De-reference the collections как только использование закончено, иначе GC не подметит их.