如何监视基于 Windows 的 JVM 的内存使用情况并在内存过高时触发警报?

如何监视基于 Windows 的 JVM 的内存使用情况并在内存过高时触发警报?

我有一个在 Windows 2008 中作为 JVM 运行的应用程序。我想监控它的内存使用情况,并在内存使用量达到特定阈值时发送电子邮件。是否有免费的实用程序或方法可以执行此操作?

答案1

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.

答案2

实际上,JVM 内存边界由启动参数控制,如-Xmx2048m -Xms256m -XX:MaxPermSize=512m(这是示例)。JVM 将使用允许的内存。稳定且无泄漏的应用程序不会超出该边界。

回到监控,可以打开 JVM 内部 SNMP 代理,然后监控堆和 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 OID,请下载JVM 管理-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 监控扎比克斯与 SNMP 一起运行在邮局全国后端集群上。它涵盖了所有运行时监控要求。如果触发某些触发器,Zabbix 可以向您发送电子邮件或 Jabber IM 消息。Zabbix 还支持 SNMP 代理监控和 SNMP 陷阱。我在云端对服务进行了一个月的测试,当时监控的 JVM 位于美国某处,而 Zabbix 服务器位于爱尔兰……即使有这样的距离/延迟,它也能很好地工作。自 2.0 版以来,就可以进行 JMX 监控,但对于安全环境来说,它可能很复杂,因为 JMX-RMI 随机设置了一些端口。

一般来说,SNMP 足以进行 JVM 运行时监控,并且 JMX 可以在开发/测试机器上提供更多帮助,因为它可以监控应用程序的细微差别。

如果你的 Windows 机器在云端,你可以使用 SaaS 监控服务之一。我对新Relic服务。它易于设置,对开发/测试阶段非常有用,因为它可以执行诸如线程转储、慢速 SQL 查询等操作,还可以在达到阈值时发送电子邮件。

答案3

由于 Windows 2012 Server 已弃用“发送电子邮件”任务类型,因此您现在需要一个可以发送电子邮件的脚本。例如,VBScript:

Set Msg = CreateObject("CDO.Message")

With Msg

 .To = "[email protected]"
 .From = "[email protected]"
 .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

其他步骤基本相同。请参阅此博客文章了解更多信息

答案4

您可以运行 JMX,但它不会显示垃圾收集器等。您还可以监视日志文件。没有实用程序可以在内存不足时重新启动 Java。但只需使用 Java 编写代码并作为服务器运行就很容易了,它会检查应用程序是否运行正常,以及您需要自己发明的业务逻辑,例如if(TotalCPUTime > 1d) restartJava();

无论如何,要通过 JMX 远程重新启动 Java,需要访问服务器,因此没有实用程序可以同时执行这两项操作 - 实际运行、观察、重新启动和监视 Java 进程。您也可以在另一个 Java 上运行此 Java,因此它将同时进行监视和重新启动,并运行一个小的 java.exe 来执行此操作。

相关内容