JVM Sun замедляется, когда больше памяти выделяется через-Xmx?

Я столкнулся с этой проблемой ранее с моим приложением
Повторяющиеся сигналы тревоги не сработают для api> 23, если телефон находится в режиме ожидания. См. Schedue Повторяющиеся аварийные сигналы
Режим ожидания также блокирует аварийный сигнал.

Что вы можете сделать, это использовать setExact и setExactAndAllowWhileIdle для api> 23 и использовать собственную логику для повторения тревоги.

if (Build.VERSION.SDK_INT >= 23) {
      alarmManager.setExactAndAllowWhileIdle(RTC_WAKEUP, calendar.getTimeInMillis(), alarmIntent);
} else {
      alarmManager.setExact(RTC_WAKEUP, calendar.getTimeInMillis(), alarmIntent);
}

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

В вашем случае снова установите будильник в AlarmReceiver на следующий день.

9
задан Stu Thompson 16 April 2009 в 08:02
поделиться

5 ответов

Если добавить больше памяти, это займет больше времени для кучи, чтобы заполниться. Следовательно, это снизит частоту сбора мусора. Однако, в зависимости от того, насколько смертны ваши объекты, вы можете обнаружить, что время, необходимое для выполнения любого отдельного ГХ, увеличивается.

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

6
ответ дан 4 December 2019 в 21:12
поделиться

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

Кстати, вы путаете -Xmx и -Xms. -Xms просто устанавливает начальный размер кучи, тогда как -Xmx - ваш максимальный размер кучи.

4
ответ дан 4 December 2019 в 21:12
поделиться

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

GC отслеживает только ссылки, а не память как таковую. В конце виртуальная машина будет выделять одинаковое количество (в основном, недолговечных, временных) объектов,

0
ответ дан 4 December 2019 в 21:12
поделиться

Согласно моему опыту, это не замедляет, НО JVM пытается все время сокращаться до Xms и пытается оставаться на нижней границе или близко к ней. Так что, если вы можете усилить это, ударьте Xms также. Sun рекомендует оба одинакового размера. Добавьте немного -XX: NewSize = 512 м (просто вымышленное число), чтобы избежать дорогостоящего скопления старых данных в старом поколении, что приведет к более длинным / более тяжелым ГХ в пути. Мы запускаем наше веб-приложение с 700 МБ NewSize, потому что большая часть данных недолговечна.

Итак, Итог: я не ожидаю замедления, но использую больше памяти для работы. Установите большую площадь нового размера и установите Xms на Xmx, чтобы снизить нагрузку на ГХ, потому что не нужно пытаться сократить пределы Xms ...

0
ответ дан 4 December 2019 в 21:12
поделиться

Как правило, это не поможет вашей работе / пропускная способность, если вы увеличите -Xmx. Теоретически могут быть более длительные этапы «остановить мир», но на практике с CMS это не является реальной проблемой.

Конечно, вы не должны устанавливать -Xmx на какое-то безумное значение, например, 300 Гбайт, если вам это действительно не нужно :)

0
ответ дан 4 December 2019 в 21:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: