Démarrer l'essai gratuit
Searching...
SoBrief
Français
EnglishEnglish
EspañolSpanish
简体中文Chinese
繁體中文Chinese (Traditional)
FrançaisFrench
DeutschGerman
日本語Japanese
PortuguêsPortuguese
ItalianoItalian
한국어Korean
РусскийRussian
NederlandsDutch
العربيةArabic
PolskiPolish
हिन्दीHindi
Tiếng ViệtVietnamese
SvenskaSwedish
ΕλληνικάGreek
TürkçeTurkish
ไทยThai
ČeštinaCzech
RomânăRomanian
MagyarHungarian
УкраїнськаUkrainian
Bahasa IndonesiaIndonesian
DanskDanish
SuomiFinnish
БългарскиBulgarian
עבריתHebrew
NorskNorwegian
HrvatskiCroatian
CatalàCatalan
SlovenčinaSlovak
LietuviųLithuanian
SlovenščinaSlovenian
СрпскиSerbian
EestiEstonian
LatviešuLatvian
فارسیPersian
മലയാളംMalayalam
தமிழ்Tamil
اردوUrdu
Java Performance

Java Performance

The Definitive Guide: Getting the Most Out of Your Code
par Scott Oaks 2014 423 pages
4.39
319 évaluations
Écouter
Essayez l'accès complet pendant 3 jours
Débloquez l'écoute et bien plus !
Continuer

Points clés

1. Optimisez les performances Java grâce à un réglage stratégique et aux bonnes pratiques

Il n’existe pas d’option magique -XX:+RunReallyFast.

La performance est un phénomène complexe. Optimiser Java, ce n’est pas seulement modifier quelques paramètres JVM, mais combiner des algorithmes efficaces, un réglage fin de la machine virtuelle et des pratiques de codage rigoureuses. Il faut comprendre le fonctionnement interne de Java pour agir efficacement.

Mesurez, ne devinez pas. Avant toute optimisation, profilez votre application. Utilisez des outils comme jconsole, jstat ou Java Flight Recorder pour collecter des données précises. Identifiez les goulets d’étranglement liés à l’utilisation CPU, à l’allocation mémoire ou à la gestion du ramasse-miettes.

Équilibrez les compromis. L’optimisation implique souvent des concessions :

  • Augmenter la taille du tas peut réduire la fréquence du GC, mais allonger les pauses
  • Multiplier les threads améliore le débit, mais augmente les changements de contexte
  • L’inlining agressif accélère les appels de méthode, mais gonfle la taille du code

Testez toujours vos ajustements dans un environnement réaliste pour vérifier qu’ils apportent les bénéfices attendus sans effets secondaires.

2. Maîtrisez la collecte des déchets pour une gestion mémoire efficace

Les ingénieurs GC du monde entier grinceront des dents, car ces techniques peuvent nuire à l’efficacité du ramasse-miettes.

Comprenez les algorithmes GC. Java propose plusieurs collecteurs, chacun adapté à des besoins spécifiques :

  • Serial GC : simple et efficace pour petits tas et applications mono-thread
  • Parallel GC : maximise le débit, idéal pour le traitement par lots
  • CMS (Concurrent Mark Sweep) : minimise les pauses, adapté aux applications réactives
  • G1 (Garbage First) : équilibre débit et pauses, recommandé pour gros tas

Ajustez les paramètres GC. Configurez la collecte selon votre application :

  • Définissez des tailles de tas adaptées (-Xms, -Xmx)
  • Modifiez la taille des générations (-XX:NewRatio)
  • Activez la journalisation GC pour analyse (-XX:+UseGCLogFileRotation)

Réduisez le turnover des objets. Limitez la création et la destruction d’objets :

  • Utilisez des pools pour les objets coûteux à instancier
  • Privilégiez les types primitifs aux classes enveloppes quand c’est possible
  • Employez StringBuilder pour les concaténations répétées

L’objectif n’est pas d’éliminer le GC, mais de le rendre efficace et prévisible.

3. Exploitez les pools de threads et la synchronisation pour une concurrence optimale

Les pools de threads sont un cas où le pooling d’objets est pertinent : les threads sont coûteux à créer, et un pool permet de limiter leur nombre facilement.

Utilisez les pools de threads avec discernement. Ils facilitent la gestion de la concurrence :

  • Choisissez la taille du pool en fonction des CPU disponibles et de la charge
  • Adaptez le type de pool selon le contexte (FixedThreadPool, CachedThreadPool)
  • Envisagez ForkJoinPool pour les algorithmes de type diviser-pour-régner

Minimisez la synchronisation. Un excès nuit aux performances :

  • Privilégiez les collections concurrentes (ConcurrentHashMap)
  • Préférez les variables atomiques aux blocs synchronisés pour les opérations simples
  • Synchronisez avec parcimonie, sur le plus petit bloc possible

Évitez la contention. Une forte concurrence sur les ressources partagées dégrade la scalabilité :

  • Utilisez des variables thread-local pour limiter le partage
  • Explorez les algorithmes sans verrou pour les opérations très concurrentes
  • Méfiez-vous du faux partage et appliquez un padding adapté si nécessaire

4. Servez-vous des outils de profilage pour détecter et résoudre les goulets d’étranglement

Les profileurs sont l’outil le plus précieux de l’analyste de performance.

Choisissez le profileur adapté. Chaque type apporte un éclairage différent :

  • Profileurs par échantillonnage : faible impact, adaptés à la production
  • Profileurs instrumentés : plus détaillés, mais plus lourds
  • Profileurs natifs : analysent la JVM et le code natif

Analysez les résultats. Repérez :

  • Les méthodes les plus consommatrices de CPU
  • Les zones à forte création d’objets
  • Les contentions sur les verrous

Combinez les approches. Pour une vision complète :

  • Profilage CPU pour les goulots computationnels
  • Profilage mémoire pour détecter fuites et allocations excessives
  • Profilage des threads pour identifier blocages et problèmes de synchronisation

Gardez à l’esprit que le profilage peut modifier le comportement de l’application ; validez toujours vos conclusions hors profilage.

5. Mettez en œuvre des techniques efficaces de gestion mémoire

Éliminer les copies redondantes d’objets immuables par canonisation réduit considérablement la mémoire utilisée.

Limitez la création d’objets. Une production excessive surcharge le GC :

  • Employez des pools pour les objets coûteux
  • Appliquez le pattern Flyweight pour les objets immuables partagés
  • Utilisez String.intern() pour les chaînes fréquemment utilisées

Optimisez les collections. Choisissez types et tailles adaptés :

  • Préférez ArrayList à LinkedList pour un accès aléatoire
  • Spécifiez la capacité initiale quand la taille est connue
  • Envisagez des collections primitives (ex. TIntArrayList) pour éviter le boxing

Gérez prudemment les gros objets. Ils peuvent fragmenter la mémoire et allonger les pauses GC :

  • Utilisez la mémoire hors tas (ByteBuffer.allocateDirect()) pour les très grands tableaux
  • Fractionnez les gros objets en morceaux plus petits
  • Soyez vigilant avec les finalizers, qui retardent la récupération

6. Exploitez la puissance de la compilation JIT pour des performances accrues

De nombreux détails influencent les performances Java, et beaucoup d’options de réglage existent. Mais il n’y a pas d’option magique -XX:+RunReallyFast.

Comprenez les bases du JIT. Le compilateur Just-In-Time optimise le code fréquemment exécuté :

  • Le code démarre en mode interprété, puis est compilé lorsqu’il devient « chaud »
  • Le code compilé est stocké en cache pour réutilisation
  • Le JIT réalise des optimisations agressives basées sur les informations d’exécution

Choisissez le compilateur adapté. Java propose plusieurs modes :

  • Client : démarrage rapide, adapté aux applications desktop
  • Server : meilleures performances à long terme, pour serveurs
  • Tiered : combine client et server pour un compromis équilibré

Affinez la compilation. Ajustez si nécessaire :

  • Contrôlez l’inlining avec -XX:MaxInlineSize et -XX:FreqInlineSize
  • Modifiez la taille du cache de code avec -XX:ReservedCodeCacheSize
  • Activez -XX:+PrintCompilation pour suivre le comportement

La plupart des applications fonctionnent bien avec les réglages par défaut ; n’intervenez qu’après profilage approfondi.

7. Optimisez l’utilisation et l’empreinte de la mémoire native

La somme de la mémoire native et du tas JVM constitue l’empreinte totale d’une application.

Surveillez la mémoire native. Elle peut représenter une part importante :

  • Utilisez jcmd avec VM.native_memory pour suivre les allocations natives
  • Contrôlez la taille mémoire résidente (RSS) du processus JVM
  • Soyez attentif aux fichiers mappés en mémoire et aux ByteBuffers directs

Optimisez les E/S mémoire-mappées. Avec NIO :

  • Réutilisez les ByteBuffers directs pour limiter les allocations
  • Privilégiez les fichiers mémoire-mappés pour les gros volumes
  • Méfiez-vous des allocations hors tas, non gérées par le GC

Réglez la mémoire native. Ajustez les paramètres :

  • Limitez les ByteBuffers directs avec -XX:MaxDirectMemorySize
  • Activez le suivi mémoire native avec -XX:NativeMemoryTracking=summary
  • Utilisez les pointeurs compressés (-XX:+UseCompressedOops) sur JVM 64 bits avec tas < 32 Go

8. Profitez des fonctionnalités Java 8 pour améliorer performances et parallélisme

Les fonctionnalités Java 8 utilisant la parallélisation automatique partagent une instance commune de ForkJoinPool.

Exploitez les streams pour des opérations concises et parallèles. Java 8 facilite la parallélisation :

  • Utilisez les streams parallèles pour les traitements CPU intensifs sur grands ensembles
  • Soyez prudent avec les opérations I/O ou sensibles à l’ordre dans les streams parallèles
  • Ajustez la taille du ForkJoinPool commun via java.util.concurrent.ForkJoinPool.common.parallelism

Tirez parti des nouvelles utilités concurrentes. Java 8 introduit des outils puissants :

  • Préférez LongAdder à AtomicLong pour les compteurs très sollicités
  • Employez StampedLock pour des verrous lecture-écriture avec lecture optimiste
  • Utilisez CompletableFuture pour gérer des opérations asynchrones complexes

Optimisez avec les expressions lambda et références de méthode. Elles peuvent rendre le code plus efficace :

  • Privilégiez les références de méthode aux lambdas pour un meilleur inlining
  • Exploitez les interfaces fonctionnelles du package java.util.function
  • Attention à l’usage excessif de petites lambdas, qui peut solliciter davantage le JIT

Gardez en tête que ces fonctionnalités améliorent les performances, mais ne remplacent pas une analyse rigoureuse. Mesurez toujours leur impact dans votre contexte spécifique.

Dernière mise à jour:

Report Issue

Résumé des avis

4.39 sur 5
Moyenne de 319 évaluations de Goodreads et Amazon.

Java Performance est unanimement salué comme un guide incontournable et complet pour les développeurs Java. Les lecteurs apprécient particulièrement son exploration approfondie des mécanismes internes de la JVM, de la gestion de la mémoire et des techniques d’optimisation des performances. Si certains le jugent exigeant en raison de sa densité technique, beaucoup le considèrent comme une lecture essentielle pour les développeurs expérimentés. L’ouvrage se distingue par ses exemples concrets, ses benchmarks précis et ses informations actualisées sur Java 7 et 8. Les critiques le recommandent régulièrement, le plaçant au même niveau que d’autres références majeures du domaine, et le conseillent vivement à ceux qui souhaitent approfondir leur maîtrise des performances Java.

Your rating:
4.64
117 évaluations
Want to read the full book?

FAQ

1. What is "Java Performance: The Definitive Guide" by Scott Oaks about?

  • Comprehensive Java performance focus: The book explores the art and science of Java performance, delving into JVM internals, garbage collection, JIT compilation, and Java SE/EE API optimizations.
  • Bridging theory and practice: Scott Oaks balances theoretical concepts with actionable advice, helping readers understand both how Java works under the hood and how to apply best practices in real-world scenarios.
  • Holistic performance coverage: Topics include memory management, threading, synchronization, object lifecycle, web container tuning, database access, and more, providing a complete view of Java performance engineering.

2. Why should I read "Java Performance: The Definitive Guide" by Scott Oaks?

  • Expert, actionable guidance: Scott Oaks is a recognized authority on Java performance, offering proven strategies to optimize applications and avoid common pitfalls.
  • Covers both Java SE and EE: The book addresses performance considerations for a wide range of Java applications, from core language features to enterprise technologies like EJBs and JPA.
  • Emphasizes measurement and tuning: Readers learn the importance of testing in real environments, using the right tools, and making data-driven optimization decisions.

3. What are the key takeaways from "Java Performance: The Definitive Guide" by Scott Oaks?

  • Performance is both art and science: Deep JVM knowledge, experience, and intuition are all necessary for effective tuning.
  • Test and measure in context: Realistic, repeated, and statistically analyzed performance testing is essential for meaningful results.
  • Holistic optimization: Effective performance work spans JVM tuning, code best practices, memory management, threading, and external system considerations.

4. What are the best quotes from "Java Performance: The Definitive Guide" by Scott Oaks and what do they mean?

  • "Performance tuning is part art and part science." This highlights the need for both technical knowledge and practical intuition in optimizing Java applications.
  • "Test real applications, not just microbenchmarks." Emphasizes that only real-world testing reveals true performance characteristics and bottlenecks.
  • "The law of diminishing returns applies to heap sizing." Reminds readers that simply increasing heap size won’t always yield better performance and can sometimes make things worse.

5. How does Scott Oaks in "Java Performance: The Definitive Guide" recommend approaching Java performance testing?

  • Test real-world scenarios: Performance testing should be conducted on the actual application as it will be used, not just on isolated modules or microbenchmarks.
  • Account for variability: Run tests multiple times and use statistical analysis (like Student’s t-test) to distinguish real regressions from random noise.
  • Integrate testing early: Automated, frequent performance testing in the development cycle helps catch regressions and collect comprehensive data for analysis.

6. What are the main Java Virtual Machine (JVM) internals and tuning strategies discussed in "Java Performance: The Definitive Guide"?

  • JIT compilation: The JVM interprets bytecode initially, then compiles hot methods to native code for better performance; tuning involves selecting compiler modes and managing code cache.
  • Garbage collection algorithms: The book covers serial, throughput (parallel), CMS, and G1 collectors, each with different trade-offs for pause times, throughput, and heap sizes.
  • Heap and generation sizing: Properly sizing the heap and its generations, and tuning related flags, is crucial to balancing GC frequency, pause times, and memory usage.

7. What are the key garbage collection (GC) algorithms and their trade-offs in "Java Performance: The Definitive Guide" by Scott Oaks?

  • Serial collector: Simple and single-threaded, best for small heaps and single-CPU systems, but causes long pause times.
  • Throughput (Parallel) collector: Multi-threaded, maximizes throughput but can have long pauses during full GC cycles.
  • Concurrent Mark Sweep (CMS): Reduces pause times by doing most work concurrently, but uses more CPU and can suffer from fragmentation and promotion failures.
  • G1 collector: Designed for large heaps, divides memory into regions, balances pause times and throughput, and reduces fragmentation risk.

8. How does "Java Performance: The Definitive Guide" by Scott Oaks advise choosing and tuning a garbage collector for your application?

  • Match GC to workload: Use serial GC for small heaps or single CPUs, throughput GC for maximizing throughput on multi-CPU systems, and CMS or G1 for low-pause requirements and large heaps.
  • Consider application type: Batch jobs with available CPU may benefit from concurrent collectors, while CPU-limited jobs may perform better with throughput GC.
  • Tune for response time goals: Throughput GC often yields better average response times, while concurrent collectors like CMS and G1 improve 90th/99th percentile response times by reducing long pauses.

9. What are the best practices for heap memory management and avoiding out-of-memory errors in "Java Performance: The Definitive Guide"?

  • Minimize object creation: Create objects sparingly and discard them quickly to reduce GC pressure, but balance this with the cost of recreating expensive objects.
  • Use object reuse techniques: Employ thread-local variables, object pools, and indefinite references (soft, weak, phantom) judiciously to manage memory efficiently.
  • Analyze and monitor heap: Use tools like jcmd, jmap, and heap analyzers to identify memory leaks and optimize object retention; trigger heap dumps on out-of-memory errors for diagnosis.

10. What threading and synchronization performance advice does Scott Oaks provide in "Java Performance: The Definitive Guide"?

  • Thread pool sizing: Set minimum and maximum thread pool sizes thoughtfully, often matching the number of worker threads to available CPUs.
  • Avoid thread oversubscription: Too many threads can degrade performance, especially for CPU-bound tasks or when external bottlenecks exist.
  • Minimize synchronization costs: Reduce the use of synchronized blocks to avoid contention; prefer lock-free utilities and thread-local variables for better scalability.

11. How does "Java Performance: The Definitive Guide" by Scott Oaks address Java EE performance, including HTTP session state, EJBs, and database access?

  • Manage HTTP session memory: Minimize session data and use server features to serialize or cache session state, reducing heap impact and GC pauses.
  • Tune EJB pools and caches: Pool EJBs to reduce initialization costs, set steady pool sizes carefully, and avoid passivation for stateful beans to maintain performance.
  • Optimize database access: Use prepared statements, statement pooling, batch operations, and properly sized connection pools; manage transactions and locking to improve scalability.

12. What are the performance implications of Java 8 features like lambdas and streams in "Java Performance: The Definitive Guide"?

  • Lambdas vs. anonymous classes: Lambdas offer similar runtime performance but reduce classloading overhead, as they are implemented as static methods.
  • Streams enable lazy evaluation: Streams process data lazily, allowing for early termination and potential performance gains over eager processing.
  • Parallel processing and filters: Streams facilitate parallel processing on multi-core systems, and while multiple filters add some overhead, they can outperform traditional iterators in many cases.

À propos de l'auteur

Scott Oaks est un auteur de renom dans le domaine de la programmation Java et de l’optimisation des performances. Fort d’une vaste expérience en développement logiciel, Oaks s’est imposé comme une référence incontournable sur les mécanismes internes de Java et l’ajustement des performances. Son style d’écriture, apprécié pour sa clarté et sa profondeur, rend accessibles des sujets complexes à un large public. Les ouvrages d’Oaks se distinguent par une approche pragmatique, alliant savoir théorique et exemples concrets accompagnés de mesures précises. Son expertise en interne de la JVM, gestion de la mémoire et profilage des performances transparaît dans chacun de ses livres, largement recommandés tant par les débutants que par les développeurs Java expérimentés.

Follow
Écouter
Now playing
Java Performance
0:00
-0:00
Now playing
Java Performance
0:00
-0:00
1x
Queue
Home
Swipe
Library
Get App
Try Full Access for 3 Days
Listen, bookmark, and more
Compare Features Free Pro
📖 Read Summaries
Read unlimited summaries. Free users get 3 per month
🎧 Listen to Summaries
Listen to unlimited summaries in 40 languages
❤️ Unlimited Bookmarks
Free users are limited to 4
📜 Unlimited History
Free users are limited to 4
📥 Unlimited Downloads
Free users are limited to 1
Risk-Free Timeline
Aujourd'hui : Accès immédiat
Écoutez les résumés complets de plus de 26 000 livres. Soit plus de 12 000 heures d'audio !
Jour 2 : Rappel d'essai
Nous vous enverrons une notification pour vous informer que votre essai se termine bientôt.
Jour 3 : Votre abonnement commence
Vous serez débité le Jun 11,
annulez à tout moment avant.
Consume 2.8× More Books
2.8× more books Listening Reading
Our users love us
600,000+ readers
Trustpilot Rating
TrustPilot
4.6 Excellent
This site is a total game-changer. I've been flying through book summaries like never before. Highly, highly recommend.
— Dave G
Worth my money and time, and really well made. I've never seen this quality of summaries on other websites. Very helpful!
— Em
Highly recommended!! Fantastic service. Perfect for those that want a little more than a teaser but not all the intricate details of a full audio book.
— Greg M
Save 62%
Yearly
$119.88 $44.99/year/yr
$3.75/mo
Monthly
$9.99/mo
Start a 3-Day Free Trial
3 days free, then $44.99/year. Cancel anytime.
Unlock a world of fiction & nonfiction books
26,000+ books for the price of 2 books
Read any book in 10 minutes
Discover new books like Tinder
Request any book if it's not summarized
Read more books than anyone you know
#1 app for book lovers
Lifelike & immersive summaries
30-day money-back guarantee
Download summaries in EPUBs or PDFs
Cancel anytime in a few clicks
Scanner
Find a barcode to scan

We have a special gift for you
Open
38% OFF
DISCOUNT FOR YOU
$79.99
$49.99/year
only $4.16 per month
Continue
2 taps to start, super easy to cancel
Settings
General
Widget
Loading...
We have a special gift for you
Open
38% OFF
DISCOUNT FOR YOU
$79.99
$49.99/year
only $4.16 per month
Continue
2 taps to start, super easy to cancel