2009-04-26 4 views

Répondre

3

Je vais répondre à votre question concernant la mémoire. Pour recevoir une notification chaque fois qu'un pool de mémoire dépasse un seuil, faites quelque chose comme ci-dessous. Pour obtenir une liste de tous les pools de mémoire, appelez ManagementFactory.getMemoryPoolMXBeans(). Ensuite, choisissez les (les) qui comptent pour vous. Une ma machine, la liste est:

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

mais je pense qu'il est délibérément aucune norme à ce sujet et ils varient entre les versions et les mises en œuvre. Alors d'abord obtenir une piscine qui vous intéresse:

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

Ensuite, vérifiez si un seuil d'utilisation est autorisée. Si oui, définie (en octets)

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

Ensuite, les notifications de demande lorsque le seuil est dépassé, en passant un NotificationListener au addNotificationListener d'un MemoryMXBean (en fait, vous devez le jeter aux NotificationEmitter en premier). Dans l'exemple, NotificationListener est une classe interne anonyme, mais elle peut être ce que vous voulez, à condition qu'elle implémente l'interface javax.management.NotificationListener. Fondamentalement, ce que j'ai fait ci-dessous est d'imprimer des messages stupides à stdout/stderr, selon la quantité de mémoire utilisée. Bien sûr, vous pouvez vous connecter à JavaMail ou à un framework de messagerie tiers pour envoyer un mail à la place.

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

En ce qui concerne les discussions, le haricot est évidemment pertinent ThreadMXBean, que vous obtenez de ManagementFactory.getThreadMXBean(). Mais il ne semble pas y avoir de façon intégrée de définir un seuil ou d'ajouter des écouteurs, vous devrez donc interroger. Vous pouvez obtenir le nombre de threads à partir de juste ManagementFactory.getThreadMXBean(). GetAllThreadIds(). Longueur, et bien sûr, il y a plus d'informations disponibles dans le bean.

Enfin, les "connexions db" sont simplement vagues. Quel système de base de données utilisez-vous? La JVM en question est-elle le serveur ou le client, etc.

Je vous recommande de poser une nouvelle question si vous avez besoin de plus d'informations sur les deux dernières ressources.

2

+1 pour la réponse Matthews

Mais si tous les utilisateurs Java + 7,40 tomberez sur cela, il y a une solution axée sur l'interface utilisateur.

Nous pourrions utiliser Java Mission Control (JMC) pour générer ces alertes. JMC est maintenant empaqueté dans la distribution Java. Appelez simplement JMC et connectez-vous au port distant JMX (si cette JVM est locale, vous devez déjà être connecté lorsque vous appelez JMC).Sur l'écran initial (MBeanServer), vous devriez voir l'onglet Déclencheurs en bas, cliquez ici. Vous devriez pouvoir configurer des déclencheurs de courriel pour les trois conditions ci-dessus. En fait, vous pourriez faire bien plus que simplement envoyer un email.

Questions connexes