SalutationsTomcat6 sur Linux utilise 100% CPU chaque fois ServerSocket est inactif
Je courais mon webapp sur le Tomcat6 java6 sur Ubuntu8.04. La servlet principale de cette application ouvre un ServerSocket, avec le simple code suivant:
ServerSocket serverSocket = new ServerSocket(6767);
Socket xmlSocket = serverSocket.accept();
Bien sûr, cela fonctionne dans un thread séparé et avec les blocs try-catch nécessaires. Quand je lance Tomcat, il charge immédiatement 100% du CPU et reste là jusqu'à ce qu'un client se connecte sur le port 6767. Tant que le client est connecté, la charge descend à 0%. Dès que le client se déconnecte, la charge remonte à 100%.
Quelqu'un peut-il me dire de quoi il s'agit?
Merci!
SOLUTION:
Les deux réponses ci-dessous ont été très utiles. Le problème n'a pas réellement à faire avec le ServerSocket, mais avec une boucle sans sommeil tout en un fil complètement différent de l'application, mais aussi dépendant si un client a été connecté ou non.
J'ai été capable d'identifier les threads actifs avec la commande JDK "jstack", puis c'était facile de trouver celui avec la boucle d'emballement.
Merci pour l'aide! :)
N'est-ce pas ServerSocket.accetp(); censé bloquer, et donne donc à tous les autres threads la chance de courir, jusqu'à ce qu'il obtient réellement une tentative de connexion d'un client? Ou est-ce que je comprends mal? – Lou
@Lou: vrai; mais en fonction * où * vous appelez la méthode 'accept()', qui peut tout geler: voir http://stackoverflow.com/questions/2170551/programme-goes-unresponsive-at-serversocket-accept-java – VonC
I J'ai ajouté sleep() et setSoTimeout (10000), ce qui est sûrement à la fois une bonne chose à faire et à rendre mon application plus robuste. Mais mon problème n'est pas que l'application ne répond pas, mais que la charge du processeur passe à 100% alors que accept() bloque (ou au moins cela semble). – Lou