Я создаю веб-приложение Java, используя Play! Рамки. Я размещаю его на playapps.net. Я некоторое время озадачиваюсь предоставленными графиками потребления памяти. Вот пример:
График исходит из периода непротиворечивой, но номинальной активности. Я не сделал ничего, чтобы вызвать спад в памяти, поэтому я предполагаю, что это произошло потому, что сборщик мусора работал, поскольку он почти достиг своего допустимого объема памяти.
Мои вопросы:
- Является ли справедливым для меня предположить, что у моего приложения нет утечки памяти, так как кажется, что вся память правильно восстановлена сборщиком мусора, когда она запускается?
- (из заголовка) Почему Java ждет до последней возможной секунды для запуска сборщика мусора? Я вижу значительное ухудшение производительности, так как потребление памяти растет до верхней четверти графика.
- Если мои утверждения выше правильные, то как я могу решить эту проблему? Другие сообщения, которые я прочитал на SO, кажутся противоположными вызовам
System.gc()
, начиная от нейтрального ( "это только запрос на запуск GC, поэтому JVM может просто игнорировать вас" ), чтобы прямо противоположно ( "код, который полагается наSystem.gc()
в основном нарушена" ). Или я отсюда, и я должен искать недостатки в моем собственном коде, который вызывает такое поведение и прерывистую потерю производительности?
Я приношу извинения за свалку мозгов вопросов; Я отлаживаю эту проблему некоторое время и очень ценю любые указатели.
UPDATE
Я открыл дискуссию на PlayApps.net, указав на этот вопрос и упомянув некоторые из пунктов здесь; особенно комментарий @Affe относительно настроек для полного GC, которые устанавливаются очень консервативно, и @G_H комментируют настройки для начального и максимального размера кучи.
Здесь ссылка на обсуждение, хотя вам, к сожалению, нужна учетная запись playapps для ее просмотра.
Я сообщу отзыв здесь, когда я его получу; Большое спасибо всем за ваши ответы, я уже многому научился у них!
Разрешение
Поддержка Playapps, которая по-прежнему велика, не имела большого количества предложений для меня, их единственная мысль заключалась в том, что если я буду использовать кеш широко, это может держать объекты живыми дольше, чем нужно, но это не так. Я все еще узнал тонну (woo hoo!), И я дал @Ryan Amos зеленый чек, так как я принял предложение звонить System.gc()
каждые пол дня, что сейчас отлично работает.
Еще раз спасибо за помощь, как всегда!