Ana Sayfa/Java & Kurumsal Mimari
Java & Kurumsal Mimari·30 Ekim 2026·7 dk okuma

Java’da Değer Sınıflarının Ötesinde Değişmez Veri Mimarisi, JDK 28 ZGC Hızlı Başlatma (JEP 545/546) ve Spring Data 2026.1.0-RC1

30 Ekim 2026 Java ve Spring bülteninde üç kritik mühendislik başlığı öne çıkıyor: Oracle Java Mimarı Dan Smith’in aktardığı Değer Sınıfları (Value Classes) ötesindeki değişmez veri (Immutable Data) ekosistemi, JDK 28’de ZGC başlatma ve yığın yönetimini dönüştüren JEP 545/546 ikilisi ve Spring Data 2026.1.0-RC1 ile jOOQ tip güvenli SQL mimarisi.

Java’da Değer Sınıflarının Ötesinde Değişmez Veri Mimarisi, JDK 28 ZGC Hızlı Başlatma (JEP 545/546) ve Spring Data 2026.1.0-RC1

Modern Java platformu bir yandan dil düzeyinde Veri Odaklı Programlama (Data-Oriented Programming) ve Değişmezlik (Immutability) garantilerini derinleştirirken, diğer yandan çalışma zamanında çöp toplayıcı (GC) başlatma hızını ve veritabanı erişim katmanlarını yeniden tanımlıyor. 29–30 Ekim 2026 itibarıyla OpenJDK ve Spring ekosistemlerinde öne çıkan üç kritik gelişme; Inside Java Podcast #73 kapsamında Dan Smith tarafından detaylandırılan Değer Sınıflarının Ötesinde Değişmez Veri mimarisi, JDK 28’de ZGC için geliştirilen JEP 545 / JEP 546 bellek optimizasyonları ve Spring Data 2026.1.0-RC1 ile jOOQ ekosistemindeki veri katmanı yenilikleri oldu.

Bu teknik bültende, söz konusu üç mühendislik başlığının kurumsal Java mimarilerine etkileri incelenmektedir.


1. Değer Sınıflarının (Value Classes) Ötesinde Değişmez Veri Mimarisi (Inside Java #73)

Resmi OpenJDK yayını Inside Java Podcast’in 29 Ekim 2026 tarihli 73. bölümünde ('Immutable Data Beyond Value Classes'), Nicolai Parlog ve Oracle Kıdemli Java Platform Geliştiricisi (Project Amber & Valhalla üyesi) Dan Smith, Java’nın değişmez veri (immutable data) vizyonunu masaya yatırdı.

JDK 28’de önizlemesi süren JEP 401 (Value Classes and Objects), nesne kimliğini (object identity) ortadan kaldırarak JVM’in değişmez nesneleri yığında (stack) skalerleştirmesine ve dizilerde düzleştirmesine (heap flattening) olanak tanıyor. Ancak Dan Smith, gerçek bir değişmez veri ekosisteminin yalnızca value class anahtar kelimesinden ibaret olmadığını; birbirini tamamlayan dört dil ve çalışma zamanı mekanizmasıyla bütünleştiğini vurguluyor:

  1. Esnek Kurucu Gövdeleri (Flexible Constructor Bodies — JEP 492 / JEP 513): Kurucu metotlarda super(...) çağrısından önce parametre doğrulaması (validation), savunmacı kopyalama (defensive copying) ve alan ataması yapılmasına izin verir. Bu sayede kısmen başlatılmış (partially initialized) bir nesnenin this referansının dışarı sızması derleme zamanında engellenerek katı başlatma (strict field initialization) garantisi sağlanır.
  2. Türetilmiş Kayıt Oluşturma (Derived Record Creation / with İfadeleri — JEP 468): Çok alanlı değişmez bir record veya value record nesnesinin yalnızca bir veya birkaç alanını güncelleyerek yeni bir kopya üretmek için kullanılan tahribatsız dönüşüm (with bloğu) sözdizimi, hantal Builder sınıflarına olan ihtiyacı ortadan kaldırır.
  3. Tembel Sabitler (Lazy Constants / Stable Values — JEP 502): Değişmezliği bozmadan, maliyetli alanların kurucu anında değil ilk erişildiğinde tam olarak bir kez (at-most-once) güvenli biçimde hesaplanmasını ve sonrasında JIT derleyicisi tarafından sabit katlama (constant folding) optimizasyonuna tabi tutulmasını sağlar.
  4. Kayıt Kalıpları (Record Patterns) ve Veri Odaklı Programlama: Değişmez veri taşıyıcılarının switch ifadeleri içinde yapıbozuma (deconstruction) uğratılarak yan etkisiz paralel işlenmesi.
mermaid
flowchart LR
    subgraph Construction["1. Güvenli İnşa Katmanı"]
        FCB["Esnek Kurucu Gövdeleri\n(super Öncesi Doğrulama & Katı Alanlar)"]
    end

    subgraph MemoryLayout["2. JVM Bellek ve JIT Katmanı"]
        VC["Value Classes (JEP 401)\n(Kimliksiz Düzleştirilmiş Bellek)"]
        LC["Lazy Constants / Stable Values\n(İlk Kullanımda Hesaplama & Constant Folding)"]
    end

    subgraph Transformation["3. Tahribatsız Dönüşüm"]
        DRC["Derived Record Creation (with)\n& Record Patterns"]
    end

    Construction --> MemoryLayout --> Transformation

2. JDK 28’de ZGC Devrimi: JEP 545 (Hızlı Başlatma ve Isınma) ve JEP 546 (Uyarlanabilir Yığın)

Düşük gecikmeli (sub-millisecond pause) Z Garbage Collector (ZGC), büyük ölçekli mikroservislerde kuyruk gecikmesini (P99.9 latency) minimize etse de, geleneksel olarak uygulama başlangıcında fiziksel bellek sayfalarını edinme ve hazırlama maliyeti nedeniyle G1GC veya ParallelGC’ye kıyasla biraz daha yavaş bir soğuk başlatma (cold-start) profiline sahipti.

Erik Österlund liderliğinde JDK 28 için yürütülen iki kardeş JEP, ZGC’nin bu kısıtını doğrudan ortadan kaldırıyor:

  • JEP 545 (Faster Startup and Warmup with ZGC): ZGC’nin başlangıç anında işletim sisteminden fiziksel bellek edinme, sanal adres haritalama ve sayfa hazırlama (page commit/pre-touch) algoritmalarını yeniden tasarlar. Bellek sayfaları yalnızca uygulamanın o anki gerçek tahsis ihtiyacına göre çok daha çevik biçimde hazırlanarak uygulama başlatma (startup) ve JIT ısınma (warmup) süreleri belirgin biçimde kısaltılır.
  • JEP 546 (Adaptive Heap Sizing for ZGC): Konteyner ve Kubernetes ortamlarında çalışan Java servislerinde -Xms ve -Xmx bayraklarını elle ayarlama zorunluluğunu azaltır. ZGC; tahsis hızını, boş bellek miktarını ve makinedeki komşu süreçlerin bellek baskısını izleyerek yığın boyutunu çalışma zamanında otonom olarak büyütüp küçültür.
Bileşen / JEP Odak Alanı Çözülen Mühendislik Darboğazı
Project Valhalla / Amber (Inside Java #73) Value Classes, with İfadeleri, Lazy Constants Kimliksiz bellek düzleştirme, güvenli super öncesi başlatma ve tembel sabit katlama
JDK 28 — JEP 545 ZGC Hızlı Başlatma ve Isınma ZGC fiziksel bellek sayfası hazırlama gecikmesinin giderilmesi (Hızlı Cold-Start)
JDK 28 — JEP 546 ZGC Uyarlanabilir Yığın Boyutlandırma Manuel -Xms/-Xmx ayarı olmadan dinamik konteyner bellek uyumu
Spring Data 2026.1.0-RC1 RedisJsonTemplate & SubscriptionListener Yerel RedisJSON belge yolu işlemleri ve anotasyonlu Pub/Sub abonelik olayları
jOOQ & Spring Boot (Lukas Eder) Derleme Zamanı Tip Güvenli SQL DSL ORM çalışma zamanı hatalarını önleyen şema güdümlü Java Record projeksiyonları

3. Spring Data 2026.1.0-RC1 (RedisJsonTemplate) ve jOOQ ile Tip Güvenli Veri Katmanı

Veri erişim katmanında ise Spring Data 2026.1.0-RC1 sürüm treni ve A Bootiful Podcast’te Josh Long ile jOOQ yaratıcısı Lukas Eder arasında gerçekleştirilen teknik söyleşi öne çıkıyor:

  1. Spring Data 2026.1.0-RC1 Yenilikleri: Mark Paluch tarafından duyurulan sürüm adayı; Spring Data Commons, JPA, Relational, Redis, KeyValue ve LDAP modüllerini 4.2-RC1, MongoDB, Cassandra ve REST modüllerini 5.2-RC1, Elasticsearch ve Couchbase modüllerini 6.2-RC1 ve Neo4j modülünü 8.2-RC1 seviyesine taşıyor. Özellikle Spring Data Redis 4.2-RC1 içerisinde:
    • JSON belgelerini doğrudan Redis üzerinde JSONPath ile okumayı ve kısmi güncellemeyi sağlayan RedisJsonTemplate API’si olgunlaştırıldı.
    • Anotasyonlu Pub/Sub dinleyici metotlarına sahip Spring bean’leri SubscriptionListener arayüzünü uyguladığında, kanal abonelik bildirimlerinin doğrudan ilgili bean’e iletilmesi sağlandı.
  2. jOOQ ve Tip Güvenli SQL Mimarisi (Lukas Eder): 29 Ekim 2026 tarihli A Bootiful Podcast bölümünde Lukas Eder, karmaşık analitik ve kurumsal sorgularda SQL’i gizlemek yerine veritabanı şemasından üretilen derleme zamanı tip güvenli Java DSL’inin (jOOQ) değişmez Java record projeksiyonlarıyla birleştirildiğinde hem insan geliştiriciler hem de AI kodlama ajanları için şema halüsinasyonlarını tamamen sıfırladığını vurguladı.

4. Kod Uygulaması: Değişmez Veri Kalıpları, RedisJsonTemplate ve SubscriptionListener

Aşağıdaki Java referans uygulaması; esnek kurucu doğrulamasıyla korunan değişmez bir record modelini, Spring Data Redis 2026.1 (4.2-RC1) içerisindeki SubscriptionListener destekli Pub/Sub bileşenini ve tip güvenli projeksiyon akışını göstermektedir:

java
package com.enterprise.data.immutable;

import java.math.BigDecimal;
import java.time.Instant;
import java.util.Objects;

import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.SubscriptionListener;
import org.springframework.stereotype.Component;

/**
 * 1. Değişmez Veri (Immutable Data) ve Savunmacı Kurucu Doğrulaması:
 * Değer sınıfları (Value Classes) ve Record mimarisiyle uyumlu veri taşıyıcısı.
 */
public record ImmutableOrderLedgerEvent(
        String orderId,
        String tenantId,
        BigDecimal totalAmount,
        Instant occurredAt
) {
    public ImmutableOrderLedgerEvent {
        Objects.requireNonNull(orderId, "orderId boş olamaz");
        Objects.requireNonNull(tenantId, "tenantId boş olamaz");
        if (totalAmount == null || totalAmount.signum() < 0) {
            throw new IllegalArgumentException("Sipariş tutarı negatif olamaz: " + totalAmount);
        }
        occurredAt = (occurredAt != null) ? occurredAt : Instant.now();
    }

    /**
     * Tahribatsız (Non-Destructive) Dönüşüm Metodu:
     * Mevcut değişmez nesneyi bozmadan güncellenmiş tutarla yeni örnek döndürür.
     */
    public ImmutableOrderLedgerEvent withAdjustedAmount(BigDecimal newAmount) {
        return new ImmutableOrderLedgerEvent(this.orderId, this.tenantId, newAmount, Instant.now());
    }
}

/**
 * 2. Spring Data Redis 2026.1.0-RC1 (4.2-RC1):
 * SubscriptionListener uygulayan dinleyici bean'lere abonelik olaylarının doğrudan iletilmesi.
 */
@Component
class OrderLedgerRedisSubscriber implements SubscriptionListener {

    public void handleOrderEvent(String payload, String channel) {
        System.out.printf("[REDIS EVENT] Kanal: %s | Yük: %s%n", channel, payload);
    }

    @Override
    public void onChannelSubscribed(byte[] channel, long count) {
        System.out.printf("[SUBSCRIPTION LISTENER] Kanala abone olundu: %s (Aktif abonelik: %d)%n",
                new String(channel), count);
    }

    @Override
    public void onChannelUnsubscribed(byte[] channel, long count) {
        System.out.printf("[SUBSCRIPTION LISTENER] Kanal aboneliği sonlandı: %s%n", new String(channel));
    }
}

5. Mühendislik Özeti

OpenJDK ve Spring ekosistemlerindeki bu üç gelişme, modern Java mimarisinin yönünü netleştiriyor: Uygulama belleğinde Value Classes, Esnek Kurucular ve Tembel Sabitler ile değişmezlik sıfır ek maliyetle standartlaşırken; JDK 28 JEP 545 ve JEP 546 sayesinde ZGC hem hızlı başlayan hem de yığınını kendi kendine boyutlandıran evrensel bir çöp toplayıcıya dönüşüyor. Veri katmanında ise Spring Data 2026.1 ve jOOQ, bu değişmez veri yapılarını doğrudan tip güvenli sorgular ve yerel JSON/Pub-Sub kanallarıyla besliyor.

Konu Etiketleri
#Java#JDK 28#Project Valhalla#ZGC#Project Amber#JEP 545#Spring Data 2026.1#jOOQ
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