如何为 jvm 中的以下更改生成邮件警报
1)内存 2)线程 3)数据库连接
通过使用 jmx
任何帮助都会有用
谢谢
我会回答你的问题:记忆。要在给定内存池超过阈值时收到通知,请执行以下操作。要获取所有内存池的列表,请调用 ManagementFactory.getMemoryPoolMXBeans()。然后选择对您重要的(那些)。一台我的机器,清单是:
Code Cache
Eden Space
Survivor Space
Tenured Gen
Perm Gen
Perm Gen [shared-ro]
Perm Gen [shared-rw]
但我认为这方面故意没有标准,它们在版本和实现之间有所不同。所以首先得到一个你感兴趣的池:
MemoryPoolMXBean memPool = ...; // Get a MemoryPoolMXBean
然后,检查是否允许使用阈值。如果是这样,设置一个(以字节为单位)
if(memPool.isUsageThresholdSupported())
{
memPool.setUsageThreshold(5000000);
}
然后,当超过阈值时,通过将 NotificationListener 传递给 MemoryMXBean 的 addNotificationListener 来请求通知(实际上,您必须先将其强制转换为 NotificationEmitter)。在示例中,NotificationListener 是一个匿名内部类,但它可以是任何你想要的,只要它实现了 javax.management.NotificationListener 接口。基本上,我在下面所做的是将愚蠢的消息打印到 stdout/stderr,具体取决于正在使用的内存量。当然,您可以连接到 JavaMail 或第三方邮件框架来发送邮件。
NotificationEmitter memBean = (NotificationEmitter)(ManagementFactory.getMemoryMXBean());
memBean.addNotificationListener(new NotificationListener()
{
public void handleNotification(Notification n, Object handback)
{
CompositeData cd = (CompositeData)n.getUserData();
MemoryNotificationInfo mni = MemoryNotificationInfo.from(cd);
MemoryUsage memUsage = mni.getUsage();
long bytesUsed = memUsage.getUsed();
if(bytesUsed > 512000000)
System.err.println("Oh, no, we're using more than 512M!");
else
System.out.println("It's okay. We're only using " + bytesUsed + " bytes.");
}
}
至于线程,相关的 bean 显然是 ThreadMXBean,您可以从 ManagementFactory.getThreadMXBean() 中获得它。但看起来没有内置的方法来设置阈值或添加侦听器,因此您必须轮询。您可以仅从 ManagementFactory.getThreadMXBean().getAllThreadIds().length 获取线程数,当然,bean 中还有更多可用信息。
最后,“数据库连接”只是模糊的。你用的是什么数据库系统?有问题的 JVM 是服务器还是客户端等。
如果您需要有关后两个资源的更多信息,我建议您提出一个新问题。
+1 马修斯的回答
但是,如果任何 Java 7.40 + 用户偶然发现这一点,则有一个面向 UI 的解决方案。
我们可以利用 Java Mission Control (JMC) 来生成这些警报。
JMC 现在已打包在 Java 发行版中,因此只需调用 JMC 并连接到 JMX 远程端口(如果此 JVM 是本地的,则在调用 JMC 时应该已经连接)。
在初始屏幕(MBeanServer)上,您应该会在底部看到“触发器”选项卡,单击此处您应该能够为上述所有 3 个条件设置电子邮件触发器 - 事实上,您可以做的不仅仅是发送电子邮件。