如何为jvm中的以下更改生成邮件提醒
1)个存储器 2)线程 3)数据库连接
使用jmx
任何帮助都会有用
谢谢
答案 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个条件设置电子邮件触发器 - 实际上您可以做的不仅仅是发送电子邮件