JAVA PERFORMANS VE JVM EĞİTİMİ
Java Performans ve JVM eğitimi, "hızlı çalışıyor" iddiasını kanıtla savunan bir disiplin kazandırmak için tasarlandı. JVM internals (heap, metaspace, code cache), Generational GC modeli, Young/Old/Survivor alanlarının izlenmesi somut diagnostic örnekleriyle işlenir.
Program sonunda katılımcı, G1, ZGC ve Shenandoah arasında workload'a göre GC seçer; jstack, jmap ve jcmd ile production diagnostic toplar; JIT compilation katmanlarını (C1, C2) ve PrintCompilation çıktısını okur. JMH ile mikro-benchmark ve Async Profiler ile flame graph yorumlama eğitimin teknik kapanışıdır.
Katılımcı Profili
Bu eğitim, JVM altında neler döndüğünü görerek performans iddialarını kanıtla savunmak isteyen rollere yöneliktir:
- Senior Java Geliştiriciler: JVM internals ve GC tuning ile uğraşan mühendisler
- Performans Mühendisleri: JMH ve profiler kullanan optimizasyon uzmanları
- SRE'ler: Üretimdeki Java servislerini izleyen mühendisler
- Backend Mühendisleri: Latency ve throughput optimize eden ekipler
- Operasyonel Yöneticiler: JVM uygulamasını production'da yöneten roller
Ön Gereklilikler
Bu eğitime katılım için aşağıdaki ön bilgiler önerilir:
- Java ile orta seviye uygulama geliştirme deneyimi
- OOP ve concurrency (Thread, synchronized) kavramlarına aşinalık
- Komut satırı ve JVM başlatma parametreleriyle temel rahatlık
- Garbage collection ve memory model'e giriş düzeyi bilgi
- Performans iddialarını test ederek doğrulamaya istek
Süresi ve Tarihi
Süre: 2 gün. Bu süre standart program içindir; ek modüllere ve hedefe göre süre özelleştirilebilir.
Eğitim tarihleri ve saatleri, ekibinizin uygunluğuna göre birlikte planlanır.
Kazanımlar
Eğitim sonunda katılımcı, JVM altında neler döndüğünü görerek performans iddialarını kanıtla savunur:
- JVM internals'ı (heap, metaspace, code cache) yapı seviyesinde okur
- Generational GC modelinde Young, Old ve Survivor alanlarını izler
- G1, ZGC ve Shenandoah arasında workload'a göre GC seçer
- jstack, jmap, jcmd ile production diagnostic toplar
- JIT compilation katmanlarını (C1, C2) ve PrintCompilation çıktısını okur
- JMH ile mikro-benchmark yazar; yaygın pitfall'ları bilir
- VisualVM, JProfiler ve Async Profiler ile flame graph yorumlar
Java Performans ve JVM Eğitimi Konuları
1. JVM Mimarisi ve Class Loading
- JVM bileşenleri: ClassLoader, runtime data area, execution engine
- Class loader hierarchy: Bootstrap, Platform, Application
- Class file format (.class) ve bytecode
- Module path ve classpath farkı
- Resmi kaynak: JVM teknolojisi genel bakışı
2. JIT Compile - HotSpot ve GraalVM
- Interpreter ve JIT compiler işbirliği
- Tiered compilation: C1 ve C2
- Method inlining ve escape analysis
- GraalVM JIT alternatifi
- Compilation log okuma
3. Memory Areas - Heap, Stack, Metaspace
- Heap: Young (Eden, Survivor), Old generation
- Stack: thread başına frame
- Metaspace: class metadata (PermGen sonrası)
- Code cache ve compiled code
- Native memory ve direct buffer
4. Garbage Collection - G1, ZGC, Shenandoah
- Generational hypothesis ve GC algoritmaları
- G1 GC: region-based ve pause time goal
- ZGC: sub-millisecond pause
- Shenandoah: concurrent compaction
- Parallel GC ve throughput odaklı senaryolar
5. GC Logging ve Tuning
- Unified GC logging (-Xlog:gc)
- GC pause time analizi
- Heap sizing: -Xms, -Xmx
- GCEasy, GCViewer araçları
- Tuning karar matrisi: throughput vs latency
6. Heap Dump Analizi - MAT ve VisualVM
- jmap ile heap dump alma
- Eclipse Memory Analyzer (MAT)
- Retained heap ve dominator tree
- Histogram ve leak suspect raporu
- OutOfMemoryError teşhisi
7. Thread Dump ve Deadlock Tespiti
- jstack ile thread dump
- Thread state: RUNNABLE, BLOCKED, WAITING, TIMED_WAITING
- Deadlock pattern tespiti
- fastThread, Samurai analiz araçları
8. Profiling - JFR (Java Flight Recorder)
- JFR ile production-safe profiling
- JDK Mission Control ile analiz
- Event tabanlı profiling modeli
- Continuous JFR recording
9. CPU Hotspots ve async-profiler
- async-profiler ile low-overhead CPU profile
- Flame graph okuma
- Method hot path tespiti
- Sampling vs instrumentation profile
10. Allocation Profiling
- Allocation hot spot tespiti
- Escape analysis ve scalar replacement
- Object pool pattern ne zaman gerekli
- String intern havuzu yönetimi
11. Concurrency Performance - LongAdder, StampedLock
- AtomicLong vs LongAdder (yüksek contention)
- StampedLock optimistic read
- ReadWriteLock kullanım sınırları
- ConcurrentHashMap iç yapısı
- Fork/Join framework ve work-stealing
12. Reactive Programming - Reactor Temel
- Mono ve Flux reactive types
- Backpressure ve demand
- Scheduler ve thread model
- Reactive vs traditional thread-per-request
13. Native Image - GraalVM AOT
- GraalVM Native Image ile AOT compile
- Fast startup ve düşük memory footprint
- Reflection ve resource sınırları
- Spring Boot Native ile entegrasyon
14. Benchmark - JMH (Microbenchmark Harness)
- JMH ile mikro benchmark yazımı
- @Benchmark, @Setup, @TearDown
- Warmup ve measurement iteration
- Dead code elimination ve sabit folding tuzağı
- Statistical analiz ve sonuç yorumu
JAVA PERFORMANS VE JVM EĞİTİMİ ile İlgili
Sıkça Sorulan Sorular ve Cevapları
G1, ZGC ve Shenandoah arasında nasıl seçim yapılır?
G1 default GC (Java 9+), regional yaklaşımla pause time'ı dengeler — çoğu uygulama için iyi. ZGC sub-millisecond pause hedefli, büyük heap (TB seviye) için tasarlandı. Shenandoah ZGC'ye benzer ama farklı concurrent algoritma. Pause-sensitive uygulamalar (trading, real-time) ZGC/Shenandoah, genel iş yükü G1.
jstack, jmap ve jcmd ne zaman kullanılır?
jstack thread dump alır — deadlock veya yüksek CPU'da hangi thread'in tıkandığını gösterir. jmap heap dump alır — memory leak analizinde MAT veya jhat ile incelenir. jcmd modern alternatif, tüm bu komutları tek arayüzde toplar. Production'da live PID'ye attach ederek non-disruptive diagnostic alır.
JIT compilation tier 1 ve tier 4 arasındaki fark nedir?
C1 (tier 1-3) hızlı derleme, az optimize — startup hızı önemli. C2 (tier 4) yavaş ama agresif optimize — hot method long-run kazançlı. Tiered compilation kombinasyonu hem hızlı startup hem peak throughput sağlar. -XX:+PrintCompilation ile hangi method'un hangi tier'da derlendiği görülür.
JMH mikro-benchmark yazımındaki tuzaklar nelerdir?
Dead code elimination JIT'in sonucu silmesine yol açar — @Benchmark return value veya Blackhole ile tüketmek gerekir. Constant folding compile-time'da değeri sabitler; @Param ile runtime input verilmeli. Warmup iteration'lar ve fork count yetersizse JIT henüz hot olmadan sonuç ölçülür. Default config'leri kullanmak güvenli.
Async Profiler ile flame graph nasıl yorumlanır?
Async Profiler safepoint-bias olmadan stack sample alır; düşük overhead ile production'da çalışır. Flame graph genişlik CPU zamanını, yükseklik call stack'i gösterir. Geniş plateau'lar hot method'lar — optimizasyon adayı. Self time ve total time ayrımı root cause'u bulmaya yardımcı.
Heap dump analizinde dominator tree nedir?
Dominator tree heap'teki her objenin 'eğer bu silinse hangi diğer obje GC'ye gider' ilişkisini gösterir. Memory leak'te büyük retained set genelde dominator tree'nin tepesinde görünür — bir 'master' obje çok şey tutuyor. Eclipse MAT bu görünümü standart sağlar.



