2015-12-04 2 views
2

J'observe un comportement étrange sur une machine Linux. Le code fonctionne bien sur Win 7. Le code incriminé se bloque sur xmlToJavaMap.keySet(). Aucune des deux déclarations de journal n'est enregistrée Aucune impasse trouvée dans le tas de tas.Java ConcurrentHashMap.keySet() se bloque

ConcurrentHashMap<String,String> xmlToJavaMap = ApplicationContext.getBean("map"); 
    logger.info("before for loop"); 
    for (String key : xmlToJavaMap.keySet()) { 
     logger.info("key: " + key); 
     ... 
    } 
    logger.info("map processed."); 

Plate-forme: version Java "1.7.0_11" Java (TM) SE Runtime Environment (build 1.7.0_11-b21) Java HotSpot (TM) 64 bits serveur VM (build-23.6 B04, mode mixte) Red Hat 4.4.7

+0

Vous voulez vérifier si ce code est réellement en cours d'exécution ou si vous pourriez avoir un problème ailleurs. Les lectures de ConcurrentHashMap sont censées être non-verrouillables. – pvg

+0

C'est ce qui est déconcertant. CHM.keySet() ne devrait pas bloquer. L'exécution atteint jusqu'à avant la boucle for, alors rien ne se passe. Le problème a commencé il y a quelques semaines dans l'un des environnements. – Prakash

Répondre

1

Utilisez jps -v pour observer votre processus Java. Ensuite, utilisez jstack pour regarder votre pile de threads. Cela pourrait vous aider à trouver la solution.

+0

jstack dump est énorme et ne détecte aucun blocage! – Prakash

+0

Ne pouvez-vous pas faire une exécution qui isole ce problème? Cela pourrait réduire la pile. – Andres

+0

Je pourrais le faire. Son code hérité (bibliothèque interne tierce). – Prakash

0

Voici ce qui se passait réellement :) xmlToJavaMap.keySet() échouait réellement avec NoSuchMethod et le thread se terminait. La trace de la pile d'erreurs était enregistrée dans un fichier journal différent qui causait la confusion. Une fois l'erreur corrigée, tout revient à la normale.