Можно ли изменить поведение сборки мусора в Java ME? - PullRequest
2 голосов
/ 27 ноября 2008

Мне было интересно, можно ли настроить работу сборщика мусора на JavaMe, чтобы как-то улучшить производительность (может уменьшить количество переходов)? Я видел некоторые статьи по этому поводу, но в основном они касались Java SE, и большинство из них говорит, что GC сильно зависит от производителя. Сколько бы это было.

Ответы [ 3 ]

3 голосов
/ 28 ноября 2008

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

Вызов java.lang.System.gc () не является гарантией того, что сборщик мусора запущен. Обычно это просто увеличивает вероятность того, что виртуальная машина начнет сборку мусора очень скоро.

Я обнаружил, что вызов System.gc () 3 раза подряд в одном и том же потоке, но из 3 различных методов, работает достаточно хорошо.

Существует много способов обойти недостатки в стандартных реализациях API JavaME, чтобы уменьшить количество создаваемого мусора:

  • Расширьте ByteArrayOutputStream, чтобы не создавать копию байтового массива при доступе к данным.

  • избегайте вызова StringBuffer.getChars () и StringBuffer.toString (). заставить ваш код работать со смещениями и длинами StringBuffer.

  • превратить локальные буферы (byte [], StringBuffer ...) в экземпляры или статические переменные (и защитить их синхронизированными). Очевидно, что это требует дополнительных затрат, но это может помешать зависанию вашего приложения из-за слишком частой сборки мусора.

  • Расширение StringBuffer, чтобы избежать переключения между String и StringBuffer: реализовать append (String, offset, length), parseInt (int), indexOf (String, index), replace (offset, StringBuffer, offset, length ) ...

...

1 голос
/ 27 ноября 2008

Я не вижу какого-либо возможного способа настройки поведения сборки мусора в J2ME.

Если у вас есть проблемы с паузами, вызванными сборками мусора, вы должны сделать две вещи:

  • Сократите объем мусора, создаваемого вашей программой, за счет повторного использования объектов и избегайте дорогостоящих вещей, таких как конкатенация строк (вместо этого используйте StringBuffer)
  • Используйте System.gc () для принудительного сбора мусора, когда небольшое зависание не имеет значения (например, во время экрана загрузки), чтобы уменьшить вероятность запуска процесса сборщика, когда он раздражает.
0 голосов
/ 11 декабря 2008

Спасибо за все входящие люди. Я видел, что невозможно настроить GC для устройств, поддерживающих Java Me. По крайней мере, не простым или полезным способом. Я все равно оставлю этот вопрос открытым, на случай, если этот сценарий как-то изменится. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...