Сокращение потребления памяти в Java

Вопрос: Я работал с некоторыми проектами, целью которых было достижение максимальной производительности и снижение потребления памяти. Но поверьте, мне уже было трудно контролировать потребление памяти в Java. Эта страница wiki, говорит о "Java Program Speed", Java в некоторых случаях равна C++ на низкоуровневых и числовых тестах. Эти статистические данные на самом деле не показывают существенную

Вопрос:

Я работал с некоторыми проектами, целью которых было достижение максимальной производительности и снижение потребления памяти. Но поверьте, мне уже было трудно контролировать потребление памяти в Java.

Эта страница wiki, говорит о “Java Program Speed”, Java в некоторых случаях равна C++ на низкоуровневых и числовых тестах.

Эти статистические данные на самом деле не показывают существенную разницу во времени. Однако использование памяти в Java значительно выше, чем C++, поскольку для каждого объекта есть 8-байтовые служебные данные и 12 байтов для каждого массива в Java (32-разрядные, в два раза больше в 64-битной Java), поскольку упомянутых выше в ссылке wiki.

Теперь вопрос в том, что все меры, предпринимаемые людьми для минимизации использования памяти в Java?

Пожалуйста, обратите внимание, что я очень обеспокоен памятью, чем производительностью, поскольку я не могу думать о лучших способах, чем “писать лучшие программы” и “правильно настраивать память в JDK”,

Ответ №1

В зависимости от того, на чем вы работаете, вы можете использовать различные методы программирования, такие как:

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

Ответ №2

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

Ответ №3

что все меры предпринимают для минимизации использования памяти в Java?

Они смотрят на небольшие тесты, а не на микро-тесты того, насколько велик массив.

Вы можете попробовать сравнить ссылки на Java (которые используют 4 байта даже на 64-JVM) для C++ общих указателей (которые могут использовать 48-байты в 64-битном процессе) и прийти к некоторому выводу, который вряд ли будет полезен в реальной программе.

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

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

Я нахожу, что эта одержимость сохранением каждого байта в большинстве случаев является анахронизмом. В ПК один байт памяти стоит около 5е-7 центов. Или около 2e-6 секунд вашего времени. Они могут складываться, но если вы сохраняете только 100 КБ, возможно, не стоит менять какой-либо код, и если вы собираетесь сэкономить 1 ГБ, возможно, стоит потратить на это пару часов. Даже если вы сохраните 1 ГБ, память будет повторно использована, но ваше время не будет.

“Если память является основным ограничением, есть ли причина, по которой вам нужна Java?”

Я согласен с этим утверждением, что если у вас есть устройство с несколькими мегабайтами, то есть меньше, чем у телефона Android, например, C будет вашим лучшим выбором. Если у вас есть устройство, которое, по крайней мере, имеет емкость смартфона, возможно, Java подходит для ваших нужд.

Ответ №4

Могут быть две мотивации для управления памятью в java.

1. Избегать частого создания/удаления объектов.

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

Избегайте временных/постоянных отверстий памяти

2. Уменьшите общее потребление памяти в VM

Это понадобится, если ваша виртуальная машина будет запущена в среде, где у вас жесткие ограничения памяти.

В идеале из соображений памяти хорошо написанная Java-программа должна попытаться достичь обоих из вышеперечисленного. Теперь, чтобы достичь 1, вы должны сделать следующее.

  • Предпочитают статическое распределение памяти, то есть выделять один раз на виртуальную машину, а не динамическое распределение памяти.

  • Избегайте создания временных объектов внутри функций, для этого большинство объектов может реализовать метод reset(), который может позволить повторному использованию объекта

  • Поймите, какой API вы используете, например. если вы используете String, вы будете
    в конечном итоге создать столько случаев, сколько есть изменений. То же самое относится к типам с автоматической коробкой.

Вышеупомянутые пункты также помогают в управлении или контроле точки 2

Чтобы проверить размер памяти виртуальной машины, вам необходимо выполнить указанные выше пункты, а также выполнить следующее

Используйте флаги Xmx и Xms во время запуска вашей виртуальной машины и преднамеренно устанавливайте свои значения для более низких значений, чем то, что может потребоваться, и будьте в поиске OutOfMemoryError.

Если происходит OutOfMemoryError, это означает, что вы превысили максимальный размер виртуальной машины. Определите причину и начните настраивать создание объекта.

Надеюсь, поможет…

Оцените статью
Добавить комментарий