Как показывает жизнь, память - одно из самых слабых мест мобильных устройств. Надо сказать, в последнее время ситуация несколько улучшилась, и на рынке все чаще появляются устройства с приличным объемом памяти. Тем не менее, полезно знать, какие виды памяти используются в MIDP устройствах и какое влияние они оказывают на процесс разработки мидлета.
Всего в MIDP поддерживается три вида памяти: Program Memory, Heap и Persistent Storage. Рассмотрим их более подробно.
Когда Вы устанавливаете MIDlet, он занимает программную память на вашем устройстве. MIDlet-ы распространяются в виде JAR файлов. Обычно размер именно этого файла принимают за размер MIDlet-а. Некоторые разработчики ограничивают размер JAR, который можно установить на их устройство. Например, приложение iDEN Update от Motorola позволяет загружать на телефон MIDlet, размер которого не превышает 50 kB; а заявленное ограничение для Nokia 3410 составляет 30 kB.
Размер программной памяти, используемой приложением, может значительно отличаться от размера JAR файла, поскольку при установке на устройство, JAR архив обычно преобразуется к внутреннему формату устройства. Многие устройства позволяют узнать, сколько памяти фактически используется MIDlet-ом.
Для достижения переносимости программы на различные устройства следует стремиться к минимизации размера мидлета. В этом Вам может сильно помочь утилита, получившая название obfuscator. Она позволяет удалить из мидлета неиспользуемые классы и методы; переименовывает методы и переменные.
Также следует минимизировать размер ресурсов. Если Вы используете Wireless Toolkit, то файлы ресурсов (например картинки) находятся в папке res вашего проекта. Очевидно, вы должны использовать как можно меньше изображений в своей программе. Также Вы можете уменьшить размер изображений, сократив число цветов в их палитре.
Во время выполнения программы все объекты, которые Вы создаете и используете, помещаются в динамическую память. Туда же помещаются все локальные переменные и переменные пользователя.
В среде выполнения J2SE размер динамической памяти составляет несколько мегабайт. Конечно, возможности мобильных устройств намного скромнее. Например, в реализации MIDP для PalmOS размер динамической памяти составляет всего 20 kB.
Чтобы узнать общий размер динамической памяти и размер доступный приложению, воспользуйтесь методами totalMemory() и freeMemory() класса java.lang.Runtime. Заметьте, что система запуска может использовать эту память для своих нужд, то есть фактически вам доступно даже меньший объем, чем возвращается методом freeMemory().
Вот несколько рекомендаций, следуя которым Вы сможете уменьшить размер используемой вашим приложением динамической памяти.
Этот вид памяти используется для хранения различных записей (например введенных вами телефонов, или таблицы рекордов в игре). В MIDP для долговременного хранения данных используется механизм Record Management System (RMS), который фактически является очень сильно урезанной базой данных. Работа с записями базы (хранилища) осуществляется посредствам класса javax.microedition.rms.RecordStore.
Минимально в MIDP под постоянную память отводится 8 kB. В зависимости от конкретного устройства это число может возрастать. При разработке MIDlet-а вы должны позаботиться о том, чтобы лимит постоянной памяти не превышался.
Для создания новой записи необходимо сначала методом openRecordStore() открыть хранилище, а затем методом addRecord() добавить новую запись. Позаботьтесь также о том, чтобы Ваше приложение отслеживало ошибку RecordStoreFullException.
Метод getSizeAvailable() выдает число байт, на которое может вырасти хранилище записей, а метод size() - текущий размер хранилища записей.
Мы рассмотрели три вида памяти, используемых мидлетом. Необходимо стремиться к разработке как можно более экономичного мидлета.
В основе статьи лежат работыJonathan Knudsen.
Перевод: aRix