如果使用jmx,如果jvm中的内存消耗超过某个thrsold,我该如何生成邮件警报/通知

时间:2009-04-26 09:15:18

标签: jmx notifications

如何为jvm中的以下更改生成邮件提醒

1)个存储器   2)线程   3)数据库连接

使用jmx

任何帮助都会有用

谢谢

2 个答案:

答案 0 :(得分:3)

我会回答你的问题:记忆。要在给定内存池超过阈值时获得通知,请执行以下操作。要获取所有内存池的列表,请调用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 :(得分:2)

+1 Matthews回答

但是,如果任何Java 7.40 +用户遇到这种情况,就会出现面向UI的解决方案。

我们可以使用Java Mission Control(JMC)来生成这些警报。

JMC现在打包在Java发行版中,因此只需调用JMC并连接到JMX远程端口(如果此JVM是本地的,则在调用JMC时应该已经连接)。

在初始屏幕(MBeanServer)上,您应该看到底部的触发器选项卡,在此处单击它您应该能够为上述所有3个条件设置电子邮件触发器 - 实际上您可以做的不仅仅是发送电子邮件