Ana Sayfa/Java & Kurumsal Mimari
Java & Kurumsal Mimari·26 Ekim 2026·8 dk okuma

JDK 28’de JEP 544 (Ahead-of-Time Code Compilation / Project Leyden), Kuşaksal Shenandoah GC (JEP 535) ve Spring Modulith 2.2-RC1

JDK 28 için resmen hedeflenen Project Leyden JEP 544 (AOTCache içinde önceden derlenmiş yerel makine kodu), JEP 535 (Varsayılan Kuşaksal Shenandoah GC) ve JEP 545 (ZGC hızlı ısınma) yenilikleri ile Spring Modulith 2.2-RC1 ve Spring Web Services 5.1.0-RC1 sürümleri incelenmektedir.

JDK 28’de JEP 544 (Ahead-of-Time Code Compilation / Project Leyden), Kuşaksal Shenandoah GC (JEP 535) ve Spring Modulith 2.2-RC1

Bulut-Yerel Java’da Soğuk Başlatma ve Isınma Darboğazının Sonu: JDK 28 ve Ekim 2026 Spring Sürümleri

Kurumsal Java uygulamalarının Kubernetes pod'ları, sunucusuz (serverless) fonksiyonlar ve yoğun ölçeklenen mikroservis kümelerinde karşılaştığı en büyük tarihsel engel, uygulamanın ayağa kalkma süresi (startup time) ile JIT (Just-In-Time) derleyicisinin sıcak metotları keşfedip optimize edene kadar geçen ısınma gecikmesidir (warmup latency). 25 Ekim 2026 itibarıyla JDK 28 için resmen hedeflenen (Targeted) JEP 544: Ahead-of-Time Code Compilation, Project Leyden vizyonunun en kritik halkasını tamamlayarak HotSpot JVM'in önceden derlenmiş yerel makine kodunu (pre-compiled native code) doğrudan AOTCache üzerinden anında çalıştırmasını sağlamaktadır.

Aynı dönemde JDK 28 bellek yönetiminde JEP 535 (Shenandoah GC: Generational Mode by Default) ve JEP 545 (Faster Startup and Warmup with ZGC) ile çöp toplama (Garbage Collection) ergonomisi yeniden tanımlanırken; Spring ekosisteminin Ekim 2026 yayın treninde duyurulan Spring Modulith 2.2-RC1 ve Spring Web Services 5.1.0-RC1 sürümleri modüler monolitlerde olay güvenilirliğini ve gözlemlenebilirliği ileriye taşımaktadır.


1. JDK 28 ve Project Leyden: JEP 544 (Ahead-of-Time Code Compilation) Nasıl Çalışır?

Project Leyden, Java'nın dinamik doğasından ödün vermeden başlatma ve ısınma sürelerini kısaltmak için kademeli bir yol haritası izlemiştir: İlk aşamada JEP 483 (JDK 24) ile önceden sınıf yükleme ve bağlama (AOT Class Loading & Linking), ardından JEP 514 ve JEP 515 (JDK 25) ile komut satırı ergonomisi ve metot yürütme profillerinin (AOT Method Profiling) önbelleğe alınması devreye sokulmuştur. JEP 544, bu AOTCache mimarisini tamamlayarak metot seviyesinde önceden derlenmiş yerel makine kodunu doğrudan önbelleğe dahil etmektedir:

  1. Eğitim Çalıştırması (Training Run) ve Üretim Çalıştırması (Production Run):
    Geliştirici veya CI/CD hattı, uygulamayı bir kez eğitim modunda çalıştırarak (-XX:AOTMode=record ve -XX:AOTMode=create) JVM'in hangi sınıfları yüklediğini, hangi metotların sıcak (hot) olduğunu ve bu metotlar için üretilen optimize edilmiş yerel makine kodunu tek bir .aot önbellek dosyasına (-XX:AOTCache=app.aot) kaydeder. Üretim ortamında uygulama bu önbellekle başlatıldığında, HotSpot JVM yorumlayıcı (interpreter) ve C1 derleme aşamalarını atlayarak ilk milisaniyeden itibaren optimize edilmiş yerel makine kodunu doğrudan yürütür.
  2. Hibrit AOT + JIT Mimarisi (GraalVM Native Image ile Temel Fark):
    Statik ikili dosya üreten çözümler (GraalVM Native Image) "kapalı dünya varsayımı" (closed-world assumption) ile çalışır; çalışma zamanında yeni sınıf yüklenemez ve yansıma (reflection), dinamik vekiller (dynamic proxies) veya bayt kodu üretimi için karmaşık JSON yapılandırma dosyaları gerekir. JEP 544 ise %100 standart HotSpot JVM üzerinde çalışır. Eğer üretim ortamındaki trafik deseni eğitim çalıştırmasından farklılaşırsa, HotSpot'un C2 JIT derleyicisi devreye girer, AOTCache içindeki önceden derlenmiş kodu geçersiz kılar (de-optimization) ve çalışma zamanındaki gerçek veriye göre metodu havada yeniden derler (on-the-fly re-optimization).
mermaid
flowchart TD
    subgraph Leyden["1. JDK 28 Project Leyden: JEP 544 (Hibrit AOT + JIT)"]
        A["Eğitim Çalıştırması: Sınıf Yükleme (JEP 483) + Metot Profili (JEP 515)"] --> B["JEP 544: Metot Seviyesi Yerel Makine Kodunun AOTCache'e Yazılması"]
        B --> C["Üretim Başlatması (-XX:AOTCache=app.aot): Sıfır Isınma Gecikmesi"]
        C --> D["Trafik Değişirse: C2 JIT Derleyicisi ile Dinamik Yeniden Optimizasyon"]
    end

    subgraph GC["2. JDK 28 Bellek Motorları: JEP 535 & JEP 545"]
        E["JEP 535: -XX:+UseShenandoahGC -> Varsayılan Kuşaksal (Generational) Mod"]
        F["JEP 545: ZGC 2 MB Başlangıç Yığını & Arka Plan Bellek Ön-Hazırlama (Pre-Touch)"]
    end

    subgraph Spring["3. Ekim 2026 Spring Sürümleri: Modulith 2.2-RC1 & WS 5.1-RC1"]
        G["Spring Modulith 2.2-RC1: ABANDONED Olay Ayrımı & 'module::**' Sınırları"]
        H["Spring Web Services 5.1-RC1: Micrometer Observation & WSDL WS-Policy"]
    end

    D --> E & F
    E & F --> G & H

    style Leyden fill:#1e1b4b,stroke:#f59e0b,stroke-width:2px,color:#f8fafc
    style GC fill:#0f172a,stroke:#38bdf8,stroke-width:2px,color:#f8fafc
    style Spring fill:#064e3b,stroke:#10b981,stroke-width:2px,color:#f8fafc

2. JDK 28 Çöp Toplama Devrimi: JEP 535 (Kuşaksal Shenandoah) ve JEP 545 (ZGC Hızlı Başlatma)

JEP 544'ün sağladığı derleme hızı, JDK 28'e hedeflenen iki önemli düşük gecikmeli çöp toplayıcı (low-latency GC) geliştirmesiyle desteklenmektedir:

  • JEP 535 — Shenandoah GC: Varsayılan Olarak Kuşaksal Mod (Generational Mode by Default):
    Deneysel aşamadan olgunluğa erişen Kuşaksal Shenandoah (Generational Shenandoah), JEP 535 ile birlikte -XX:+UseShenandoahGC bayrağı verildiğinde varsayılan çalışma modu haline gelmektedir. Kısa ömürlü genç nesneleri (young generation) yaşlı nesnelerden (old generation) bağımsız ve sık toplayan bu mimari, tek kuşaklı klasik SATB (Snapshot-At-The-Beginning) moduna kıyasla çok daha düşük bellek ayak izi ve ani yük sıçramalarına karşı yüksek dayanıklılık sunmaktadır. Klasik tek kuşaklı mod (-XX:ShenandoahGCMode=satb) gelecekte kaldırılmak üzere kullanımdan kaldırılmış (deprecated) olarak işaretlenmiştir.
  • JEP 545 — ZGC ile Daha Hızlı Başlatma ve Isınma (Faster Startup and Warmup with ZGC):
    Geleneksel olarak ZGC kullanıcıları zor bir ikilemle karşılaşıyordu: Küçük bir başlangıç yığını (-Xms) seçildiğinde uygulama hızlı başlıyor ancak yığın büyürken işletim sistemi sayfa hataları (OS page faults) nedeniyle ısınma süresi uzuyordu; büyük -Xms seçildiğinde ise ısınma hızlanıyor fakat başlangıç süresi ve boşta bellek tüketimi artıyordu. JEP 545 (JEP 546 adaptif yığın boyutlandırma ile birlikte), ZGC'nin 2 MB gibi minimal bir başlangıç yığınıyla anında açılmasını ve arka plan işçi iş parçacıklarının (worker threads) uygulama talebinin hemen önünde fiziksel bellek sayfalarını eşzamanlı olarak hazırlamasını (concurrent pre-touch & mapping) sağlayarak sayfa hatası darboğazını ortadan kaldırmaktadır.
Özellik / Bileşen Önceki Durum (JDK 21–25 / Spring 2.0) JDK 28 & Ekim 2026 Spring RC1 Üretim Ortamı Mühendislik Kazanımı
Project Leyden (AOTCache) Sınıf yükleme (JEP 483) + Profil (JEP 515) JEP 544: Önceden Derlenmiş Yerel Makine Kodu Tam JVM dinamizmiyle anında tepe (peak) performans
Shenandoah GC Varsayılanı Tek kuşaklı (satb) varsayılan JEP 535: Kuşaksal (Generational) Varsayılan Daha düşük yığın belleğiyle yüksek tahsis hızı
ZGC Başlatma / Isınma -Xms başlangıç vs. sayfa hatası ikilemi JEP 545: 2 MB Başlangıç + Eşzamanlı Bellek Hazırlama Küçük bellek ayak iziyle sıfır sayfa hatası gecikmesi
Spring Modulith 2.1.x (Temel olay kayıt defteri) 2.2.0-RC1 (ABANDONED durumu & module::**) İşlem hizalı olay tamamlama ve derin modül kapsüllemesi
Spring Web Services 5.0.x 5.1.0-RC1 (Micrometer Observation & WSDL Policy) Kurumsal SOAP/WSDL servislerinde uçtan uca izlenebilirlik

3. Spring Modulith 2.2-RC1 ve Spring Web Services 5.1.0-RC1 Yenilikleri

Spring ekosisteminin 22–23 Ekim 2026 tarihli birleşik yayın treninde kurumsal mimarileri doğrudan ilgilendiren iki önemli Aday Sürüm (Release Candidate) yayımlanmıştır:

  1. Spring Modulith 2.2-RC1 (ve 2.1.2 / 2.0.9 / 1.4.14 Bakım Sürümleri):
    Modüler monolit mimarilerinde modüller arası asenkron olay iletişimi yürüten Event Publication Registry bileşeninde iki kritik iyileştirme yapılmıştır: İlk olarak, olay tamamlama güncellemeleri (event completion updates) artık varsayılan olarak aktif veritabanı işlemiyle (transaction alignment) hizalanmaktadır. İkinci olarak, yeniden deneme süresi dolmuş veya terk edilmiş olay yayınları (ABANDONED) ile anlık hata almış (FAILED) yayınlar birbirinden ayrılarak operasyonel izleme netleştirilmiştir. Ayrıca @ApplicationModule(allowedDependencies = "billing::**") sözdizimiyle bir modülün tüm alt paketlerine özyinelemeli (recursive) erişim izni tanımlanabilmektedir.
  2. Spring Web Services 5.1.0-RC1:
    Spring Framework 7.1 ve Spring Security 7.1 tabanına yükseltilen bu sürüm, kurumsal SOAP/XML entegrasyonları için Micrometer Observation API tabanlı metrik/izleme (tracing) desteğini ve otomatik üretilen WSDL bağlamalarına doğrudan WS-Policy güvenlik/politika belgeleri ekleme yeteneğini getirmiştir.

Aşağıdaki Java 28 ve Spring Modulith 2.2-RC1 örneği, module::** bağımlılık kuralıyla tanımlanmış bir modülde işlem hizalı olay işlemeyi ve ABANDONED olay denetimini göstermektedir:

java
package com.tastutanlabs.erp.invoicing;

import org.springframework.modulith.ApplicationModule;
import org.springframework.modulith.events.ApplicationModuleListener;
import org.springframework.modulith.events.IncompleteEventPublications;
import org.springframework.stereotype.Service;

import java.time.Duration;
import java.time.Instant;
import java.util.UUID;

/**
 * Spring Modulith 2.2-RC1 & JDK 28 JEP 544 AOTCache uyumlu modüler servis.
 * Not: package-info.java üzerinde @ApplicationModule(allowedDependencies = "ledger::**")
 * kullanılarak alt paket bağımlılıkları bildirimsel olarak denetlenir.
 */
@Service
public class InvoiceSettlementModuleService {

    public record OrderCapturedEvent(UUID orderId, long amountCents, Instant occurredAt) {}

    private final IncompleteEventPublications incompleteEvents;

    public InvoiceSettlementModuleService(IncompleteEventPublications incompleteEvents) {
        this.incompleteEvents = incompleteEvents;
    }

    // Spring Modulith 2.2-RC1: Olay tamamlama durumu varsayılan olarak aktif işlemle (TX) hizalanır
    @ApplicationModuleListener
    public void onOrderCaptured(OrderCapturedEvent event) {
        if (event.amountCents() <= 0) {
            throw new IllegalArgumentException("Geçersiz sipariş tutarı: " + event.orderId());
        }
        System.out.printf("[Modulith 2.2] Sipariş faturalandırıldı: %s (%d sent)%n",
                event.orderId(), event.amountCents());
    }

    // Terk edilmiş (ABANDONED) hale düşmeden önce belirli süreyi aşan yarım kalmış olayları yeniden tetikler
    public void resubmitStalePublications() {
        incompleteEvents.resubmitIncompletePublicationsOlderThan(Duration.ofMinutes(15));
    }
}

Uygulamayı JDK 28 JEP 544 yerel kod önbelleği ve JEP 535 Kuşaksal Shenandoah GC ile derleyip çalıştırmak için kullanılan üretim komut dizisi ise şu şekildedir:

bash
# 1. Aşama (CI/CD Eğitim Çalıştırması): Sınıf, profil ve yerel makine kodunu kaydet
java -XX:AOTMode=record -XX:AOTConfiguration=app.aotconf -jar erp-modulith.jar --spring.context.exit=onRefresh
java -XX:AOTMode=create -XX:AOTConfiguration=app.aotconf -XX:AOTCache=erp.aot -jar erp-modulith.jar

# 2. Aşama (Üretim Çalıştırması): JEP 544 AOT yerel kod + JEP 535 Varsayılan Kuşaksal Shenandoah
java -XX:AOTCache=erp.aot -XX:+UseShenandoahGC -jar erp-modulith.jar

Sonuç ve Değerlendirme

JDK 28 için hedeflenen JEP 544 (Ahead-of-Time Code Compilation), JEP 535 (Varsayılan Kuşaksal Shenandoah) ve JEP 545 (ZGC Hızlı Isınma) üçlüsü, Java'nın yirmi yıllık "yavaş başlar ama sonradan hızlanır" algısını kökten yıkmaktadır. HotSpot JVM'in tüm dinamik yeteneklerini koruyarak AOTCache üzerinden anında yerel makine kodu yürüten bu mimari, Spring Modulith 2.2-RC1'in işlem hizalı modüler yapısı ve Spring Web Services 5.1.0-RC1'in Micrometer gözlemlenebilirliğiyle birleştiğinde kurumsal bulut iş yükleri için hem düşük bellek maliyeti hem de milisaniyelik ilk-istek yanıt süresi sunmaktadır.

Konu Etiketleri
#JDK 28#Project Leyden#JEP 544#ZGC#AOTCache#Shenandoah GC#Spring Modulith#Spring Web Services
Emre Taştutan
Emre TaştutanGeliştirici & AI Meraklısı

Yazılım mimarisi, mikroservis ekosistemleri ve üretken yapay zeka uygulamaları üzerine çalışıyorum. TastutanLabs çatısı altında geliştirici araçları ve SaaS ürünleri inşa ediyorum.

@tastutanlabs • Instagram Mini-Blog

Bu analizin 6 kartlık görsel özetini Instagram'da inceleyin ve kaydedin

Her gün yazılım mimarisi, Java/JVM ve yapay zeka gelişmelerini kendi başına okunabilen 6 slaytlık Mini-Blog serileri halinde paylaşıyoruz.

Instagram'da Takip Et →
Bu Yazıyı Paylaş:

Yorumlar (0)

Düşüncelerinizi Paylaşın

Henüz yorum yapılmamış. İlk yorumu siz yapın!

Bu Kategorideki Diğer İncelemeler

Java & Kurumsal Mimari

OpenJDK ‘Project Detroit’ (FFM ile V8 ve CPython), Spring Boot Yerel ‘Cloud Foundry / kind’ Orkestrasyonu ve Quarkus 4.0 Mimarisi

OpenJDK'nın Foreign Function & Memory (FFM) API üzerinden Google V8 ve CPython çalışma zamanlarını doğrudan JVM sürecine gömen Project Detroit girişimi, Spring Boot uygulamalarında Docker/kind tabanlı yerel Cloud Foundry dağıtımı ve Quarkus 4.0 (Vert.x 5, HTTP/3, Hibernate 8) mimarisi inceleniyor.

Emre TaştutanEmre Taştutan
9 dk
Java & Kurumsal Mimari

JDK 28’de ‘JEP 401 Value Classes’ ve Değişmez Veri Mimarisi, Spring AI 2.1 ‘MessagePart’ Akıl Yürütme Korunumu ve Özel Vektör ‘Upsert’ API’si

OpenJDK 28 erken erişim sürümlerinde 30 çekirdek sınıfı kimliksiz değer nesnesine dönüştüren JEP 401 (Value Classes), çok turlu akıl yürütme imzalarını kayıpsız taşıyan Spring AI 2.1 MessagePart mimarisi ve önceden hesaplanmış float[] vektörleri destekleyen VectorStore.upsert() yetenekleri inceleniyor.

Emre TaştutanEmre Taştutan
10 dk