Вот пара моментов, которые могут помочь улучшить использование памяти приложением при разумном использовании .Но учтите, что они не являются универсально применимыми, и если вы не понимаете, что делаете, вы можете получить плохой результат .... значительно более сложную программу и незначительное улучшение использования памяти.
Тщательно проектируйте / выбирайте структуры данных вашей коллекции
Многие стандартные типы коллекций Java довольно требовательны к памяти.Например, ArrayList<Integer>
состоит из 2 объектов для начала и дополнительного объекта для каждого элемента массива (в зависимости от того, как элементы создаются ...).Кроме того, резервный массив ArrayList
может быть больше, чем нужно.Напротив, int[]
состоит только из одного объекта и использует только одно 32-битное слово на элемент.
(Аналогичное сравнение может быть сделано для более сложных структур данных, особенно когда базовый тип являетсяпримитивный тип. Существуют сторонние библиотеки, которые реализуют такие вещи, например библиотеки GNU Trove.)
Очевидно, что если вы тщательно проектируете свои структуры данных, вы можете представлять их, используя меньше памяти и меньше объектов.
Однако, с другой стороны, это усложняет и усложняет обслуживание вашего приложения.Например:
Использование int[]
вместо ArrayList<Integer>
приводит к большему раскрытию деталей реализации и увеличению сцепления.
Использование массивов для представления списков переменных или неопределенных размеров сложно.
Множество API-интерфейсов предназначены для приема параметров List
или Collection
, а не параметров массива.Таким образом, вам, скорее всего, придется разрабатывать свои собственные не библиотечные версии библиотечного кода.
Обобщения и массивы плохо сочетаются.
В итоге, хотя вы можете сэкономить место в куче, вы , скорее всего, будете платить другими способами.
Использовать изменяемые классы
Экземпляры таких классов, как String
и BigInteger
являются неизменяемыми.Это упрощает вычислительную модель, но это означает, что «изменение» чего-либо подразумевает создание новых объектов.Вы часто можете уменьшить использование памяти на:
, используя изменяемые версии типов;например, используя StringBuilder
/ StringBuffer
вместо String
или
, делая ваши собственные классы данных приложения изменяемыми, а не неизменяемыми.
Еще раз, есть обратная сторона.Изменчивые структуры данных могут привести к большей сложности;например, если ваше приложение является многопоточным, или если вам нужно иметь возможность отменить какие-либо действия для возврата или потому, что какой-то шаг не удался.Это делает ваше приложение более сложным.В некоторых случаях единственным жизнеспособным решением является копирование структуры данных, в результате чего используется больше памяти.
В итоге, хотя вы можете сэкономить пространство кучи, вы вполне можете в конечном итоге платить другими способами.И вы можете даже не сохранить память в конце.