Как я могу отслеживать использование памяти для оконной JVM и запускать предупреждение, если оно становится слишком высоким?
У меня есть приложение, которое работает как JVM в Windows 2008. Я хотел бы отслеживать использование памяти и получать электронное письмо, если / когда использование памяти достигает определенного порога. Есть ли бесплатная утилита или метод для этого?
5 ответов
ОС Win2008 может отправлять оповещения о пороговых условиях счетчика производительности.
Part 1 # Perfmon
Launch Performance Monitor (perfmon.msc)
Create a new User Defined Data Collector Set
Choose to create manually after naming
Select Performance Counter Alert
Click Add - choose the Object, Counter and Instance to monitor. Process/Java.exe/Working Set
Specify the alert threshold
Choose "open properties for this data collector set"
Specify a start schedule if the server is on a reboot schedule
Change the sample interval. Alert repeats at this interval when value it above threshold
Under Alert task, give it a name (like sendMail)
Start the Data Collector Set
Part 2 # Schedule Tasks
Open up scheduled tasks (compmgmt.msc/configuration/task scheduler)
Create a task, not a basic task
Name it the exact same name you did in the above section (like sendMail)
Check "user is logged in or not" so that it runs all the time. Change username if necessary.
Create a new email action under the Action tab
Enter all the info for from, to, subject, etc.
Enter the SMTP server.
You will be prompt for the password to run the task when you are not logged on.
Фактически границы памяти JVM контролируются параметрами запуска, такими как -Xmx2048m -Xms256m -XX:MaxPermSize=512m
(это пример). JVM будет использовать эту разрешенную память. Стабильное не протекающее приложение не выйдет за эти границы.
Возвращаясь к мониторингу, можно включить внутренний агент SNMP JVM, а затем отслеживать использование памяти кучами и PermGen, и через частное сообщество SNMP вы можете установить пороговые значения при превышении JVM будет отправлять ловушки SNMP. Фактически это "корпоративное решение мониторинга" с помощью таких инструментов, как HP OpenView. Параметры Cmdline:
-Dcom.sun.management.snmp.port=10001 -Dcom.sun.management.snmp.acl=/home/liferay/snmp.acl -Dcom.sun.management.snmp.interface=0.0.0.0
Они самоочевидны. Шаблон файла ACL находится по адресу JRE_HOME/lib/management/snmp.acl.template
, Чтобы получить удобочитаемые ответы, а не только идентификаторы SNMP, загрузите JVM-MANAGEMENT-MIB.mib. Некоторое краткое объяснение здесь на сайте Oracle. Когда SNMP включен, вы можете проверить возвращаемые датчики, запустив:
snmpwalk -v2c -c public YourWinHost:10001 -m JVM-MANAGEMENT-MIB jvmMgtMIB
Ожидайте, что вы уже положили JVM-MANAGEMENT-MIB.mib
каталог по умолчанию Net-SNMP MIB (командная строка Unix или CygWin).
Чтобы не забывать об отправке почты, я делаю мониторинг JVM с помощью Zabbix в сочетании с SNMP на кластере, работающем по всей стране с внутренним кластером почтового отделения. Он охватывает все требования мониторинга времени выполнения. Zabbix может отправить вам электронное письмо или сообщение Jabber IM в случае срабатывания триггера. Zabbix поддерживает мониторинг агента SNMP и ловушки SNMP. Я провел месячный тест сервисов в облаке, когда отслеживаемая JVM была где-то в США, а Zabbix сервер в Ирландии... он хорошо работал даже при таких расстояниях / задержках. Начиная с версии 2.0 возможен мониторинг JMX, но для безопасных сред он может быть сложным, поскольку JMX-RMI настраивает некоторые порты случайным образом.
В целом SNMP достаточно для мониторинга времени выполнения JVM, и JMX может больше помочь на машинах разработки / тестирования, поскольку он может отслеживать нюансы приложений.
Если вы находитесь в облаке на своем компьютере с Windows, вы можете использовать одну из служб мониторинга SaaS. Я был очень впечатлен услугами NewRelic. Он прост в настройке и действительно полезен для фаз разработки / тестирования, потому что может выполнять такие вещи, как дампы потоков, медленные запросы SQL, так же он может отправлять электронные письма при достижении порога.
Поскольку Windows 2012 Server устарел тип задачи "Отправить электронную почту", теперь вам потребуется сценарий, который будет отправлять электронную почту. Например, VBScript:
Set Msg = CreateObject("CDO.Message")
With Msg
.To = "MySelf@gmail.com"
.From = "from@address.com"
.Subject = "low memory"
.TextBody = "low memory, check the server now"
.Send
.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail.yourserver.com"
.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = cdoBasic
.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False
.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "smtp-user"
.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "smtp-password"
End With
Другие шаги в значительной степени такие же. Обратитесь к этому сообщению в блоге для получения дополнительной информации
Вы можете настроить мониторинг с помощью JMX.
Это серверное приложение, работающее на Tomcat или сервер приложений JEE? или это приложение Java командной строки? или Java-приложение Windows Service Wrapped? Какая JVM? Какие настройки? Oracle JDK Rockit имеет отличный монитор памяти, Oracle JRockit Mission Control 4.1 или http://visualvm.java.net/index.html.
Вы можете написать поток в вашем приложении, который спит и просыпается, чтобы проверить память.
Смотрите эти сообщения: https://stackoverflow.com/questions/1058991/how-to-monitor-java-memory-usage или https://stackoverflow.com/questions/74674/how-to-do-i-check-cpu-and-memory-usage-in-java
Вы можете запустить JMX, но он не показывает, например, сборщик мусора. Вы также можете отслеживать файл журнала. Нет утилиты для перезапуска Java, когда ему не хватает памяти. Но кодирование просто на Java и запуск в качестве сервера, который проверяет, работают ли приложения в порядке, и бизнес-логику, которую вы должны придумать сами, например: if(TotalCPUTime > 1d) restartJava();
В любом случае, для перезапуска Java удаленно через JMX требуется доступ к серверу, поэтому нет никакой утилиты, которая бы выполняла эти два действия одновременно - для фактического запуска, наблюдения, перезапуска и мониторинга процесса Java. Вы также можете запустить эту Java на другой Java, поэтому она будет выполнять мониторинг и перезапуск одновременно, и для этого запустит небольшой java.exe.