2010-08-10 30 views
4

Nous développons un serveur et nous voulons programmer le contrôle de congestion. Ce que nous voulons faire est de détecter quand le tas libre est en dessous d'un certain seuil et d'arrêter d'accepter de nouvelles données jusqu'à ce que la mémoire libre remonte. Notre première approche a utilisé runtime.freeMemory. Cela a provoqué de faux positifs car le tas libre est passé sous le seuil avant que GC ne démarre. J'ai trouvé une question similaire sur ce site et la réponse a été d'utiliser MemoryPoolMXBean. Cela ressemble à la bonne façon, car nous pouvons obtenir une notification lorsque la mémoire libre AFTER GC est en dessous d'un avertissement. Mais ... quelle piscine surveiller? Je ne veux pas que mon implémentation dépende du type de GC que la JVM a décidé d'utiliser. Une option consisterait à additionner l'utilisation de tous les pools de mémoire de tas et à l'utiliser comme statistique. Est-ce une bonne solution?Comment utiliser MemoryPoolMXBean

Merci, Doron

+0

Votre solution devrait déjà être assez bonne, je ne pense pas qu'il y en ait une meilleure. – Heri

+0

Oui, il semble que la somme de la mémoire libre dans tous les pools de mémoire de tas fonctionne. Ce n'est pas 100% précis mais les tests l'ont suffisamment démontré pour notre contrôle de congestion. – daramasala

Répondre

0

Nous avons essayé l'approche que je décrivais dans ma question: nous surveillons tous les pools de mémoire de type tas, résumant leur espace libre. Une fois que l'espace libre total passe en dessous du seuil, nous passons en mode congestion. Nous avons fait beaucoup de tests et cela fonctionne très bien. Donc je suppose que je peux marquer cela comme une réponse.