У меня есть приложение, которое работает как JVM в Windows 2008. Я хотел бы отслеживать использование памяти и получать электронное письмо, если / когда использование памяти достигает определенного порога. Есть ли для этого бесплатная утилита или метод?
Фактически границы памяти JVM контролируются параметрами запуска, такими как -Xmx2048m -Xms256m -XX:MaxPermSize=512m
(это пример). JVM будет использовать эту разрешенную память. Стабильное не протекающее приложение за эти границы не выйдет.
Возвращаясь к мониторингу, можно включить внутренний агент SNMP JVM, а затем отслеживать использование памяти куч и PermGen, а через частное сообщество SNMP вы можете установить пороговые значения при превышении JVM будет отправлять ловушки SNMP. Фактически это «корпоративное решение для мониторинга» с помощью таких инструментов, как HP OpenView. Используемые параметры командной строки:
-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 и т. Д. Он может отправлять электронные письма при достижении порога.
ОС 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.
Поскольку в 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.