2017-08-26 2 views
2

J'ai eu quelques problèmes à trouver des points dans mon code qui peuvent être améliorés pour un meilleur parallélisme. J'ai une tâche assez lourde que j'exécute plusieurs fois avec un ExecutorService. Cependant, en le rendant un peu plus lourd (en modifiant ses paramètres), j'ai remarqué qu'il y a un problème où mes tâches attendent toutes que l'une d'elles se termine, alors que je m'attendais à ce que chaque tâche agisse indépendamment l'une de l'autre. Je me demandais s'il y avait un moyen d'analyser mon code pour trouver les points où mes threads attendent une ressource, de sorte que je sache où je devrais modifier afin d'améliorer les performances parallèles de mon programme. Le programme est relativement gros, donc analyser chaque flux de contrôle en lui-même prendrait un temps prohibitif (tout en étant sujet aux erreurs), et je préfère le faire d'une manière programmatique.Comment analyser quelles méthodes/ressources tiennent un thread en Java?

Nous vous remercions de votre temps.

+0

Votre tâche utilise-t-elle (potentiellement) un traitement de flux parallèle? – Bohemian

+0

À moins d'un comportement inattendu pour 'Collections # stream()', j'ai vérifié qu'il n'y avait pas d'appels 'Stream # parallel()' pour ma tâche, mais comme la base de code est suffisamment grande pour que je ne connaisse pas tous les détails il, ayant un moyen programmatique de trouver des points où le code pourrait accrocher aiderait probablement – Badashi

Répondre

1

Le plus simple est de prendre quelques vidages de thread avec jstack et voir où se trouvent la plupart des threads. Si cela ne suffit pas exécuter un profileur, encore une fois le plus simple est probablement Visual VM CPU sampler et il vous dira où chaque thread passe du temps, y compris en attente. Cela devrait couvrir les cas les plus courants.