Использование памяти Playframework - PullRequest
10 голосов
/ 12 февраля 2012

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

(Виртуальный) сервер имеет около 750 МБ, но также работает сервер MySQL и 12 виртуальных серверов Apache. Иногда становится временно непослушным (или очень медленным) на короткие периоды. Я думаю, это из-за подкачки (это не процессор).

Нужно ли фреймворку столько памяти? Я мог бы ограничить использование памяти параметром JVM -Xmx256m или около того, но какое значение указать и по какой причине он использует столько памяти?

Это использование Play! до и после запуска:

Java: ~~~~~ Версия: 1.6.0_26 Home: /usr/lib/jvm/java-6-sun-1.6.0.26/jre Макс. Память: 194641920 бесплатно память: 11813896 Общая память: 30588928 Доступные процессоры: 2

После перезагрузки: Java: ~~~~~ Версия: 1.6.0_26 Home: /usr/lib/jvm/java-6-sun-1.6.0.26/jre Макс. Память: 194641920 бесплатно память: 9893688 Общая память: 21946368 Доступные процессоры: 2

Ответы [ 2 ]

6 голосов
/ 12 февраля 2012

Я предполагаю, что 680768 КБ памяти, о которой вы сообщаете, исходит от инструмента ОС, такого как ps или диспетчер задач. Общий объем памяти, используемой JVM, не вызывает временное зависание приложения. Вероятная причина приостановки заключается в том, что сборщик мусора JVM выполняет полный GC, который приостановит все потоки в JVM, на котором работает полный GC (если у вас не настроен параллельный gc).

Вы должны запустить JVM, запускающую игровую рамку с -verbosegc -XX: + PrintGCDetails, чтобы увидеть, что делает GC.

На ваш вопрос «Нужно ли Play Framework столько памяти» ответить невозможно, поскольку объем используемой памяти будет зависеть от того, что делает ваше приложение по предварительному запросу. Кроме того, JVM разрешает работу кучи, а затем выполняет цикл GC для очистки кучи. JVM-приложение с хорошим поведением должно отображать рисунок пилы на графике ГХ.

Я не знаю, какую JVM вы используете, если вы используете горячую точку VM, прочитайте руководство по настройке JVM. http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html Обычно перед тем, как читать руководство по настройке JVM для понимания, вам необходимо понять следующие принципы GC.

  • Сбор мусора с меткой и меткой
  • Пометка, уборка и компактная сборка мусора
  • Копировальный коллектор
  • Поколение мусора
  • Параллельная сборка мусора
  • Одновременная сборка мусора

http://www.amazon.com/Garbage-Collection-Handbook-Management-Algorithms/dp/1420082795/, вероятно, хорошая книга на эту тему

Несколько бесплатных инструментов, которые поставляются вместе с JVM горячей точки, которые вы можете использовать, включают jconsole и jvisualvm. У jvisualvm есть хороший плагин VisualGC, который отлично подходит для изучения того, как hotspot vm управляет памятью.

5 голосов
/ 13 февраля 2012

Это зависит от многих вещей, но да, java нужна память для собственного размещения, кучи и не кучи памяти.

Состояние воспроизведения говорит о том, что ваша куча потребляет только 30588928 байт, но при запуске java выделяет194641920 за кучу.Вы можете попробовать начать с -Xmx64M, чтобы ограничить выделение кучи.

Затем вы можете сэкономить около 128 Мо оперативной памяти, но java также выделяет память для jvm, поэтому объем процесса будет больше 64 Мо, это зависит от вашей платформы, но будет не менее 200/ 250 Мо.

Попробуйте ограничить кучу до 64Mo, но 750 Мо может быть недостаточно для запуска jvm и mysql.

Имейте в виду, что вы не должны использовать своп с java, потому что памятьрасположен в одном блоке, поэтому вы можете поменять местами всю кучу.

...