1

如何为 jvm 中的以下更改生成邮件警报

1)内存 2)线程 3)数据库连接

通过使用 jmx

任何帮助都会有用

谢谢

4

2 回答 2

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 是服务器还是客户端等。

如果您需要有关后两个资源的更多信息,我建议您提出一个新问题。

于 2009-04-26T11:23:48.420 回答
2

+1 马修斯的回答

但是,如果任何 Java 7.40 + 用户偶然发现这一点,则有一个面向 UI 的解决方案。

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

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

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

于 2015-08-25T21:38:53.973 回答