2009-04-26 8 views

Antwort

3

Ich beantworte Ihre Frage zu: Speicher. Um eine Benachrichtigung zu erhalten, wenn ein bestimmter Speicherpool einen Schwellenwert überschreitet, führen Sie einen der folgenden Schritte aus. Um eine Liste aller Speicherpools zu erhalten, rufen Sie ManagementFactory.getMemoryPoolMXBeans() auf. Dann wähle die für dich wichtigen aus. Eine meiner Maschine, die Liste ist:

Code Cache 
Eden Space 
Survivor Space 
Tenured Gen 
Perm Gen 
Perm Gen [shared-ro] 
Perm Gen [shared-rw] 

aber ich denke, es ist absichtlich kein Standard auf diesem und sie variieren zwischen Versionen und Implementierungen. So erhalten Sie zuerst einen Pool, an dem Sie interessiert sind:

MemoryPoolMXBean memPool = ...; // Get a MemoryPoolMXBean 

Überprüfen Sie dann, ob ein Verwendungsschwellenwert zulässig ist. Wenn ja, eins gesetzt (in Bytes)

if(memPool.isUsageThresholdSupported()) 
{ 
    memPool.setUsageThreshold(5000000); 
} 

Dann Anfrage Benachrichtigungen, wenn die Schwelle überschritten wird, durch eine NotificationListener zum addNotificationListener eines MemoryMXBean vorbei (eigentlich haben Sie es zu gieße NotificationEmitter zuerst). In diesem Beispiel ist der NotificationListener eine anonyme innere Klasse, kann aber beliebig sein, solange er die javax.management.NotificationListener-Schnittstelle implementiert. Was ich im Folgenden gemacht habe, ist das Drucken von dummen Nachrichten nach stdout/stderr, je nachdem wie viel Speicher verwendet wird. Natürlich können Sie JavaMail oder ein Mail-Framework eines Drittanbieters verwenden, um stattdessen eine E-Mail zu senden.

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."); 
    } 
} 

Soweit Fäden, die relevante Bohne offensichtlich ThreadMXBean, die Sie von ManagementFactory.getThreadMXBean get(). Aber es sieht nicht so aus, als gäbe es eine eingebaute Möglichkeit, einen Schwellenwert festzulegen oder Listener hinzuzufügen, also müssen Sie abfragen. Sie können die Thread-Anzahl nur von ManagementFactory.getThreadMXBean(). GetAllThreadIds(). Length abrufen, und natürlich sind in der Bean weitere Informationen verfügbar.

Schließlich ist "db Verbindungen" nur vage. Welches Datenbanksystem verwenden Sie? Ist die fragliche JVM der Server oder Client usw.

Ich empfehle Ihnen, eine neue Frage zu stellen, wenn Sie weitere Informationen zu den letzten beiden Ressourcen benötigen.

2

+1 für Matthews Antwort

Aber wenn irgendwelche Java 7.40 + Benutzer über diese stolpern eine UI-orientierte Lösung.

Wir könnten die Java Mission Control (JMC) verwenden, um diese Warnungen zu generieren.

JMC ist jetzt in der Java-Distribution enthalten, rufen Sie einfach JMC auf und stellen Sie eine Verbindung zum JMX-Remote-Port her (wenn diese JVM lokal ist, sollten Sie bereits beim Aufruf von JMC verbunden sein).

Auf dem Startbildschirm (MBeanServer) sollten Sie die Registerkarte Trigger unten sehen, klicken Sie hier, Sie sollten E-Mail-Trigger für alle drei oben genannten Bedingungen einrichten können - in der Tat könnten Sie viel mehr als nur senden Email.