Optimisation des performances Java : huit anti-modèles qui ralentissent votre code

Améliorations des performances grâce à la correction des anti-modèles
Jonathan Vogel a développé une application Java de traitement de commandes qui avait initialement un temps d'exécution de 1 198 ms, traitait 85 000 commandes par seconde, utilisait un peu plus de 1 Go de tas et avait 19 pauses de GC. Après avoir corrigé huit anti-modèles sans changements architecturaux ni mises à jour du JDK, les performances se sont améliorées à 239 ms de temps d'exécution, 419 000 commandes par seconde, 139 Mo de tas et 4 pauses de GC. Cela représente un débit multiplié par 5, une utilisation du tas réduite de 87 % et 79 % de pauses de GC en moins.
Huit anti-modèles de performance Java à corriger
- Concaténation de chaînes dans les boucles - Copie O(n²) due à l'immuabilité
- Itération de flux O(n²) dans les boucles - Parcours de la liste complète par élément
- String.format() dans les chemins critiques - StringBuilder le plus lent, analyse le format à chaque appel
- Autoboxing dans les chemins critiques - Des millions d'objets wrapper jetables
- Exceptions pour le flux de contrôle - fillInStackTrace() parcourt toute la pile d'appels
- Synchronisation trop large - Un verrou devient le goulot d'étranglement
- Recréation d'objets réutilisables - ObjectMapper, DateTimeFormatter, Gson par appel
- Épinglage de threads virtuels (JDK 21-23) - synchronized + E/S bloquantes épingle les porteurs
Exemples détaillés et corrections
1. Concaténation de chaînes dans les boucles
Code problématique :
String report = "";
for (String line : logLines) {
report = report + line + "\n";
}Cela crée une copie O(n²) due à l'immuabilité de String. Les benchmarks JMH de BellSoft montrent que lorsque n est multiplié par 4, la concaténation en boucle ralentit de plus de 7 fois.
Correction :
StringBuilder sb = new StringBuilder();
for (String line : logLines) {
sb.append(line).append("\n");
}
String report = sb.toString();Remarque : Depuis JDK 9, le compilateur optimise la concaténation sur une seule ligne comme "Order: " + id + " total: " + amount, mais cette optimisation ne s'applique pas aux boucles.
2. O(n²) accidentel avec des flux dans les boucles
Code problématique :
for (Order order : orders) {
int hour = order.timestamp().atZone(ZoneId.systemDefault()).getHour();
long countForHour = orders.stream()
.filter(o -> o.timestamp().atZone(ZoneId.systemDefault()).getHour() == hour)
.count();
ordersByHour.put(hour, countForHour);
}Ce motif représentait près de 71 % des échantillons de pile CPU dans l'enregistrement JFR. Avec 10 000 commandes, il effectue 100 millions de comparaisons au lieu d'un seul passage.
Correction :
for (Order order : orders) {
int hour = order.timestamp().atZone(ZoneId.systemDefault()).getHour();
ordersByHour.merge(hour, 1L, Long::sum);
}Cela offre des performances O(n) avec un seul passage. Vous pourriez également utiliser Collectors.groupingBy(... Collectors.counting()) dans un pipeline de flux unique.
Cet article est la partie 1 d'une série de 3 parties sur l'optimisation des performances Java, les parties 2 et 3 arrivant bientôt. La partie 2 examinera les données de profilage derrière ces chiffres, y compris les graphiques en flammes et les méthodes réellement critiques.
📖 Read the full source: HN AI Agents
👀 See Also

Construction d'un assistant multi-agent entièrement local avec OpenClaw et Ollama
Un développeur partage sa pile pour un assistant IA personnel entièrement local utilisant OpenClaw et Ollama, incluant les modèles qwen3.5:35b-a3b, gemma3:4b, mistral:7b, des serveurs MCP pour Home Assistant et Gmail, ainsi qu'une interface Telegram Bot.

Serveur Custom 4x RTX PRO 6000 vs Dell GB300 : Décision pour 30 pipelines affinés
Une analyse approfondie de deux architectures sur site pour exécuter environ 30 pipelines de production affinés : un serveur 4U personnalisé avec 4-8x RTX PRO 6000 Blackwell (96 Go chacun) contre l'appliance NVIDIA GB300 Grace Blackwell avec 252 Go HBM3e + 496 Go de mémoire unifiée.
OpenClaw 2026.9.1 Migration : Notes de mise à niveau des systèmes multi-agents hérités provenant de r/openclaw
Un utilisateur documente une mise à niveau réussie d'OpenClaw 2026.7.1-2 vers 2026.9.1, couvrant les migrations de configuration, les mises à jour de schéma et les correctifs multi-agents—réalisée via Codex en environ 30 minutes.

Comment accéder à GPT-5.4 en avance sur OpenClaw via le canal Développeur
Le canal de développement (dev) d'OpenClaw offre actuellement un accès anticipé au modèle GPT-5.4 avant sa sortie stable officielle. Les utilisateurs doivent basculer leur passerelle vers le canal dev en utilisant une commande spécifique et la redémarrer pour voir le modèle dans leur liste.