Ana Sayfa/Java & Kurumsal Mimari
Java & Kurumsal Mimari·3 Kasım 2026·7 dk okuma

OpenJDK Project Babylon ‘Code Reflection’ ve HAT GPU Hızlandırma, JDK 28 ‘JEP 539 / JEP 540’ ve Spring AI 2.1 ‘Session API’ Mimarisi

OpenJDK Project Babylon ‘Code Reflection’ ve HAT GPU Hızlandırma, JDK 28 ‘JEP 539 / JEP 540’ ve Spring AI 2.1 ‘Session API’ Mimarisi

1. OpenJDK Project Babylon: ‘Code Reflection’ ve HAT ile Saf Java’dan GPU Çekirdeklerine

Java ekosisteminin yapay zeka, bilimsel hesaplama ve yüksek performanslı matris işlemlerindeki en büyük tarihsel engeli, JVM’in grafik işlemciler (GPU) ve tensör hızlandırıcılar gibi yabancı donanım mimarileriyle doğrudan konuşamamasıydı. Geleneksel Java yansıması (reflection — java.lang.reflect), çalışma zamanında yalnızca sınıf, metot, alan ve anotasyon imzalarını görebilirken, bir metodun veya lambda ifadesinin yürütülebilir gövdesinin içini (kontrol akışını, döngülerini ve aritmetik ifadelerini) göremiyordu. OpenJDK Project Babylon, bu sınırı Code Reflection (Kod Yansıması) mimarisiyle aşarak Java’da yeni bir metaprogramlama çağı başlatıyor.

Project Babylon ile birlikte javac derleyicisi, işaretlenen Java metotlarının sembolik ve yapılandırılmış bir ara temsilini —Kod Modelini (Code Model / SSA IR)— doğrudan .class dosyalarının içine gömüyor. Bu mimarinin en somut mühendislik ürünü olan HAT (Heterogeneous Accelerator Toolkit) ise "Reflect, Transform, Accelerate" (Yansıtma, Dönüştürme ve Hızlandırma) boru hattıyla saf Java kodunu doğrudan GPU üzerinde koşturuyor:

mermaid
flowchart LR
    subgraph Compile["1. Derleme Zamanı (javac)"]
        A["Saf Java Hesaplama Metodu / Lambda"] --> B["Sembolik Kod Modeli (Code Model)<br/>.class Dosyasına Gömülür"]
    end

    subgraph Runtime["2. Çalışma Zamanı HAT Boru Hattı"]
        C["Reflect:<br/>Code Reflection API ile Modelin Yakalanması"] --> D["Transform:<br/>Döngü Döşeme & Vektörleştirme Analizi"]
        D --> E["Lower:<br/>NVIDIA CUDA / OpenCL C Çekirdeğinin Üretilmesi"]
    end

    subgraph Hardware["3. Donanım Yürütme (Accelerate)"]
        F["Birleşik / Ayrık GPU Bellek Eşleme<br/>(cuBLAS Seviyesinde Paralel Yürütme)"]
    end

    B --> C
    E --> F
  1. Reflect (Yansıtma): HAT, çalışma zamanında Code Reflection API’sini kullanarak geliştiricinin saf Java ile yazdığı paralel hesaplama çekirdeğini (kernel) sembolik bir soyut sözdizimi ve kontrol akışı ağacı olarak yakalar.
  2. Transform (Dönüştürme ve İndirgeme): Yakalanan kod modeli analiz edilerek döngü döşeme (loop tiling), birleşik bellek erişimi (coalesced memory access) ve vektörleştirme optimizasyonlarından geçirilir; ardından çalışma zamanında hedef donanıma özgü NVIDIA CUDA veya OpenCL C koduna indirgenir (lowering).
  3. Accelerate (Hızlandırma): JNI (Java Native Interface) karmaşası veya harici C++ sarmalayıcıları olmadan, Java veri yapıları doğrudan GPU bellek bölgelerine (Panama Foreign Function & Memory API tabanlı bellek yerleşimleriyle) eşlenir ve yerel cuBLAS kütüphanelerine yakın tepe performansta çalıştırılır.

2. JDK 28’de ‘JEP 539: Strict Field Initialization’ ve ‘JEP 540: Simple JSON API’

Mart 2027’de genel kullanıma (GA) sunulacak olan JDK 28 ana geliştirme hattında, hem JVM çekirdek güvenliğini hem de standart kütüphane ergonomisini doğrudan etkileyen iki önemli JEP öne çıkıyor:

  • JEP 539 — Strict Field Initialization in the JVM (Önizleme): Klasik JVM spesifikasyonunda bir nesne bellekte ayrıldığında tüm alanları önce örtük olarak varsayılan sıfır-değerlerle (0, 0.0, false veya null) başlatılır; ardından yapıcı metot (<init>) çalışarak gerçek değerleri atar. Ancak yapıcı metot tamamlanmadan önce this referansı dışarı sızarsa veya karmaşık sınıf başlatma döngüleri oluşursa, final olarak işaretlenmiş bir alanın bile önce null/0, milisaniyeler sonra ise gerçek değerini döndürdüğü tehlikeli yarış durumları (race conditions) gözlemlenebilir. JEP 539 (Project Valhalla’nın Değer Nesneleri / JEP 401 Value Objects altyapısıyla da uyumlu olarak), JVM seviyesinde katı başlatılan alanlar (strictly-initialized fields) kavramını getiriyor. Bu modelde bir alan açıkça başlatılmadan kesinlikle okunamıyor; böylece kısmen başlatılmış nesne hataları derleme ve sınıf doğrulama (bytecode verification) aşamasında engellenirken, HotSpot C2 JIT derleyicisine çok daha güçlü sabit katlama (constant folding) garantileri sunuluyor.
  • JEP 540 — Simple JSON API (Kuluçka / Incubator): Java geliştiricileri yirmi yılı aşkın süredir en basit bir JSON yapılandırma dosyasını okumak veya küçük bir REST yanıtını ayrıştırmak için bile Jackson, Gson veya Jakarta JSON-P gibi harici bağımlılıkları projelerine eklemek zorunda kalıyordu. JEP 540, karmaşık ORM veri bağlama (data binding) veya ağır anotasyon ağacı iddiasına girmeden, doğrudan JDK içerisinde hafif, değişmez (immutable) ve desen eşleme (pattern matching) dostu bir yerleşik JSON ayrıştırma ve üretme API’si tanımlıyor.
Teknoloji / JEP Hedef Sürüm / Proje Çözülen Temel Mühendislik Sorunu Mimari Kazanım
Code Reflection & HAT OpenJDK Project Babylon Geleneksel yansımanın metot gövdesini görememesi ve GPU erişim zorluğu Saf Java kodunun çalışma zamanında CUDA/OpenCL çekirdeklerine dönüştürülmesi
JEP 539 (Preview) JDK 28 Yapıcı metot sırasında 0/null varsayılan değerlerin gözlemlenebilmesi Katı alan başlatma ile tam nesne bütünlüğü ve C2 JIT sabit katlama optimizasyonu
JEP 540 (Incubator) JDK 28 Basit JSON işlemleri için dahi harici kütüphane (Jackson/Gson) zorunluluğu Sıfır harici bağımlılıklı, hafif ve standart JDK JSON API’si
Spring AI Session API Spring AI 2.1 (Kasım 2026) Klasik ChatMemory yapısının uzun ajan oturumlarında bağlam şişmesi yaratması Olay kaynaklı (event-sourced) kısa süreli bellek ve otomatik bağlam sıkıştırma

3. Spring AI 2.1 ‘Session API’: Olay Kaynaklı Kısa Süreli Bellek ve Bağlam Sıkıştırma

Kurumsal Java ekosisteminde yapay zeka ajanlarının orkestrasyonunu üstlenen Spring AI, Kasım 2026 sürüm takviminde yer alan Spring AI 2.1 ile birlikte bellek yönetim mimarisini baştan aşağı yeniliyor. İlk nesil sohbet uygulamaları için tasarlanan klasik ChatMemory arayüzü resmen kullanımdan kaldırılmak üzere işaretlenirken (@Deprecated), yerine çok adımlı otonom ajan iş akışları için tasarlanan Spring AI Session API devreye alınıyor.

Yeni Session API iki temel mimari yenilik getiriyor:

  1. Olay Kaynaklı (Event-Sourced) Oturum Durumu: Konuşma geçmişi yalnızca düz bir metin listesi olarak değil; kullanıcı istemleri, araç çağrıları (ToolCall), ara muhakeme parçaları (MessagePart) ve sistem durum geçişlerinden oluşan değişmez bir olay günlüğü (immutable event log) olarak saklanıyor.
  2. Deterministik Bağlam Sıkıştırma (Context Compaction): Uzun süren ajan oturumlarında token maliyetini ve bağlam penceresi taşmalarını önlemek amacıyla Session API, olay günlüğünün ham denetim izini (audit trail) korurken modele gönderilen aktif çalışma belleğini (working memory) belirli eşiklerde otomatik olarak özetleyip sıkıştırıyor.

Mühendislik Uygulaması: Katı Başlatmalı (Strict-Init) ve Olay Kaynaklı Spring AI 2.1 Oturum Sıkıştırıcı

Aşağıdaki Java referans uygulaması, JDK 28 JEP 539 felsefesine uygun olarak tüm alanları nesne yayınlanmadan önce katı biçimde doğrulanan değişmez veri kayıtlarını ve Spring AI 2.1 Session API mimarisindeki Olay Kaynaklı Bağlam Sıkıştırma (Event-Sourced Context Compaction) motorunu göstermektedir:

java
package com.tastutanlabs.springai.session;

import java.time.Instant;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

/**
 * JDK 28 JEP 539 (Strict Field Initialization) ilkeleri ve
 * Spring AI 2.1 Session API Olay Kaynaklı Bağlam Sıkıştırma Referans Mimarisi.
 */
public final class EventSourcedAgentSessionManager {

    public enum EventKind {
        USER_PROMPT,
        TOOL_EXECUTION_RESULT,
        ASSISTANT_REASONING,
        COMPACTED_CHECKPOINT
    }

    /**
     * JEP 539 uyumlu katı başlatılan (strictly-initialized) değişmez oturum olayı.
     * Hiçbir alan varsayılan null/0 durumunda gözlemlenemez.
     */
    public record SessionEvent(
            String eventId,
            EventKind kind,
            String payload,
            int estimatedTokens,
            Instant occurredAt
    ) {
        public SessionEvent {
            Objects.requireNonNull(eventId, "eventId katı başlatılmalıdır");
            Objects.requireNonNull(kind, "kind katı başlatılmalıdır");
            Objects.requireNonNull(payload, "payload katı başlatılmalıdır");
            Objects.requireNonNull(occurredAt, "occurredAt katı başlatılmalıdır");
            if (estimatedTokens < 0) {
                throw new IllegalArgumentException("Token sayısı negatif olamaz");
            }
        }
    }

    public record CompactedWorkingContext(
            int totalAuditEvents,
            int activeWindowEvents,
            int tokensBeforeCompaction,
            int tokensAfterCompaction,
            List<SessionEvent> activeModelView
    ) {}

    private final int maxActiveTokens;
    private final int retainRecentEventsCount;
    private final List<SessionEvent> immutableEventLog = new ArrayList<>();

    public EventSourcedAgentSessionManager(int maxActiveTokens, int retainRecentEventsCount) {
        if (maxActiveTokens <= 0 || retainRecentEventsCount <= 0) {
            throw new IllegalArgumentException("Oturum eşikleri pozitif olmalıdır");
        }
        this.maxActiveTokens = maxActiveTokens;
        this.retainRecentEventsCount = retainRecentEventsCount;
    }

    public void appendEvent(SessionEvent event) {
        immutableEventLog.add(Objects.requireNonNull(event));
    }

    /**
     * Tam olay günlüğünü (audit log) bozmadan, modele gönderilecek
     * aktif çalışma bağlamını (working context) sıkıştırır.
     */
    public CompactedWorkingContext buildModelWorkingContext() {
        int totalTokens = immutableEventLog.stream()
                .mapToInt(SessionEvent::estimatedTokens)
                .sum();

        if (totalTokens <= maxActiveTokens || immutableEventLog.size() <= retainRecentEventsCount) {
            return new CompactedWorkingContext(
                    immutableEventLog.size(),
                    immutableEventLog.size(),
                    totalTokens,
                    totalTokens,
                    Collections.unmodifiableList(new ArrayList<>(immutableEventLog))
            );
        }

        int splitIndex = immutableEventLog.size() - retainRecentEventsCount;
        List<SessionEvent> olderEvents = immutableEventLog.subList(0, splitIndex);
        List<SessionEvent> recentEvents = immutableEventLog.subList(splitIndex, immutableEventLog.size());

        int olderTokens = olderEvents.stream().mapToInt(SessionEvent::estimatedTokens).sum();
        int compactedCheckpointTokens = Math.max(120, olderTokens / 5);

        SessionEvent checkpoint = new SessionEvent(
                "chk-" + splitIndex,
                EventKind.COMPACTED_CHECKPOINT,
                "[Özetlenmiş Olay Kaynağı: " + olderEvents.size() + " geçmiş adım sıkıştırıldı]",
                compactedCheckpointTokens,
                Instant.now()
        );

        List<SessionEvent> activeView = new ArrayList<>(retainRecentEventsCount + 1);
        activeView.add(checkpoint);
        activeView.addAll(recentEvents);

        int newTotalTokens = activeView.stream().mapToInt(SessionEvent::estimatedTokens).sum();
        return new CompactedWorkingContext(
                immutableEventLog.size(),
                activeView.size(),
                totalTokens,
                newTotalTokens,
                Collections.unmodifiableList(activeView)
        );
    }

    public static void main(String[] args) {
        EventSourcedAgentSessionManager session = new EventSourcedAgentSessionManager(4_000, 2);
        session.appendEvent(new SessionEvent("ev-1", EventKind.USER_PROMPT, "Sipariş veritabanı şema analizi talebi", 600, Instant.now()));
        session.appendEvent(new SessionEvent("ev-2", EventKind.TOOL_EXECUTION_RESULT, "DDL çıktısı (45 tablo)...", 3_200, Instant.now()));
        session.appendEvent(new SessionEvent("ev-3", EventKind.ASSISTANT_REASONING, "İndeks eksikliği tespit edildi", 850, Instant.now()));
        session.appendEvent(new SessionEvent("ev-4", EventKind.TOOL_EXECUTION_RESULT, "EXPLAIN ANALYZE raporu...", 1_900, Instant.now()));

        CompactedWorkingContext ctx = session.buildModelWorkingContext();
        System.out.printf(
                "[Spring AI 2.1 Session] Denetim Olayı: %d | Aktif Pencere: %d | Token: %d -> %d%n",
                ctx.totalAuditEvents(),
                ctx.activeWindowEvents(),
                ctx.tokensBeforeCompaction(),
                ctx.tokensAfterCompaction()
        );
    }
}

Sonuç: Donanım Hızlandırmalı ve Durum Güvenli Modern Java

Kasım 2026 itibarıyla OpenJDK ve Spring ekosisteminde atılan bu adımlar, Java’nın hem alt seviye donanım hızlandırmasında hem de üst seviye yapay zeka orkestrasyonunda ne kadar hızlı evrildiğini gösteriyor. Project Babylon ve HAT ile saf Java metotları doğrudan GPU çekirdeklerine derlenirken, JDK 28 JEP 539 ve JEP 540 dilin çalışma zamanı güvenliğini ve standart kütüphane sadeliğini güçlendiriyor; Spring AI 2.1 Session API ise kurumsal ajanların bellek yönetimini olay kaynaklı mühendislik disiplinine kavuşturuyor.

Konu Etiketleri
#Java#JEP 540#JDK 28#Project Babylon#Code Reflection#HAT#Spring AI#JEP 539
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