Alesta WEB

Kısa cevap: Java 27 (JDK 27), Eylül 2026'da genel kullanıma açıldı ve dokuz JEP içeriyor. Üretimde en çok fark yaratacak üç değişiklik kalıcı: G1 artık her ortamda varsayılan çöp toplayıcı (JEP 523), TLS 1.3'te kuantum sonrası hibrit anahtar değişimi kod değişikliği olmadan geliyor (JEP 527) ve sıkıştırılmış nesne başlıkları varsayılan oldu (JEP 534). JFR kayıtlarında hassas veri gizleme (JEP 536) de varsayılan açık. Lazy Constants, ilkel tiplerle desen eşleme, yapılandırılmış eşzamanlılık ve PEM kodlaması önizlemede kalmaya devam ediyor. Java 27 LTS değil; uzun destek isteyenler için Java 25 LTS geçerli.

Dokuz JEP bir bakışta (JEP overview)
| JEP | Başlık | Durum |
|---|---|---|
| 523 | G1'in tüm ortamlarda varsayılan çöp toplayıcı olması | Kalıcı |
| 527 | TLS 1.3 için kuantum sonrası hibrit anahtar değişimi | Kalıcı |
| 534 | Sıkıştırılmış nesne başlıkları varsayılan | Kalıcı |
| 536 | JFR'de süreç içi veri gizleme | Kalıcı |
| 531 | Lazy Constants | 3. önizleme |
| 532 | Desenlerde, instanceof ve switch'te ilkel tipler | 5. önizleme |
| 533 | Yapılandırılmış eşzamanlılık (Structured Concurrency) | 7. önizleme |
| 538 | Kriptografik nesnelerin PEM kodlaması | 3. önizleme |
| 537 | Vector API | 12. kuluçka (incubator) |
JEP 523: G1 her yerde varsayılan (G1 by default)
Şimdiye kadar JVM, uygulamaya tek CPU veya 1.792 MB'tan az fiziksel bellek düştüğünde otomatik olarak Serial GC seçiyordu. Küçük konteynerlerde ve ucuz sanal sunucularda bu sık görülen bir durumdu ve aynı uygulama farklı makinelerde farklı çöp toplayıcıyla çalışıyordu. Java 27'de bu kural kalktı: CPU ve bellek ne olursa olsun varsayılan G1.
Çoğu uygulama için bu daha öngörülebilir duraklama süresi demek. Çok küçük bellekli bir ortamda Serial GC'nin düşük ek yükünü tercih ediyorsanız, bunu açıkça belirtmeniz gerekiyor:
# Eski davranışa dönmek (küçük konteynerler için)
java -XX:+UseSerialGC -jar uygulama.jar
# Hangi GC'nin seçildiğini görmek
java -Xlog:gc -versionJEP 527: Kuantum sonrası TLS 1.3 (Post-quantum hybrid key exchange)
TLS 1.3 bağlantılarında klasik algoritma ile kuantum sonrası algoritmayı birleştiren hibrit anahtar değişimi geldi. Amaç "şimdi kaydet, sonra çöz" (harvest now, decrypt later) saldırılarına karşı korumak: bugün kaydedilen şifreli trafik, ileride güçlü bir kuantum bilgisayarla çözülemesin.
İyi haber şu: javax.net.ssl kullanan uygulamalar bunu kod değişikliği olmadan alıyor. Kodunuzda belirli anahtar değişimi gruplarını elle seçtiyseniz (ör. SSLParameters.setNamedGroups), hibrit grup listeye eklenmediği sürece devreye girmez; bu satırları gözden geçirin. Karşı taraf hibrit grubu desteklemiyorsa bağlantı klasik algoritmaya düşer.
Aynı yönde başka bir adım da OpenSSH'de atıldı; OpenSSH 10.6 yazımızda imza tarafındaki hibrit algoritmayı anlattık.
JEP 534: Sıkıştırılmış nesne başlıkları (Compact object headers)
64 bit platformlarda HotSpot nesne başlıkları 64 bite indirildi ve bu artık varsayılan. Java'da çok sayıda küçük nesne üreten uygulamalarda (koleksiyonlar, DTO'lar, JSON ayrıştırma) yığın kullanımı belirgin şekilde azalır; daha az bellek, daha az GC çalışması demek. Daha önce deneysel bayrakla açılan bu özellik artık kendiliğinden geliyor.
# Bir sorun görürseniz geçici olarak kapatmak için
java -XX:-UseCompactObjectHeaders -jar uygulama.jarBu bayrağı yalnız sorun ayıklarken kullanın; yerel kod (JNI) veya nesne düzenine doğrudan bakan kütüphaneler dışında uyumluluk sorunu beklenmiyor.
JEP 536: JFR'de veri gizleme (JFR in-process data redaction)
Java Flight Recorder kayıtları; komut satırı argümanları, ortam değişkenleri ve sistem özellikleri gibi başlangıç verilerini de içeriyordu. Bu alanlarda veritabanı parolası veya API anahtarı olabiliyordu ve kayıt dosyası destek ekibine gönderildiğinde sır da gidiyordu. Java 27'de bu veriler, kayıt JVM'den çıkmadan önce gizleniyor. Özellik varsayılan açık; JFR seçenekleriyle ayarlanabilir veya kapatılabilir.
Önizlemedeki özellikler (Preview features)
- Lazy Constants (JEP 531, 3. önizleme): Yalnız ilk kullanıldığında hesaplanan ama sonra sabit gibi davranan değerler. Bu turda
isInitialized()veorElse()kaldırıldı,Set.ofLazy(...)fabrika metodu eklendi. - İlkel tiplerle desen eşleme (JEP 532, 5. önizleme): Değişiklik yok, yeniden önizlemede.
- Yapılandırılmış eşzamanlılık (JEP 533, 7. önizleme): Hazır birleştiriciler (joiner) artık
ExecutionExceptionfırlatıyor. - PEM kodlaması (JEP 538, 3. önizleme): Bazı sınıfların adı değişti,
PEMrecord olmaktan çıkıp normal sınıf oldu. - Vector API (JEP 537): Valhalla projesi tamamlanana kadar kuluçkada kalıyor.
İlkel tiplerle desen eşlemenin nasıl göründüğüne bir örnek:
static String boyut(int bayt) {
return switch (bayt) {
case 0 -> "boş";
case int b when b < 1024 -> b + " B";
case int b -> (b / 1024) + " KB";
};
}# Önizleme özellikleriyle derleme ve çalıştırma
javac --release 27 --enable-preview Ornek.java
java --enable-preview OrnekÖnizleme API'leri sürümden sürüme değişiyor (Lazy Constants'ta iki metot bu turda kaldırıldı). Üretim kodunda kullanmayın.
Geçiş kontrol listesi (Upgrade checklist)
- LTS mi, değil mi? Java 27 kısa destekli bir sürüm; altı ay sonra Java 28 gelir. Uzun süre dokunmayacağınız sistemler için Java 25 LTS'te kalmak mantıklı.
- Konteyner bellek ayarlarını ölçün. Küçük bellekli konteynerlerde Serial GC'den G1'e geçiş bellek kullanımını biraz artırabilir. Yük testinde
-Xlog:gcçıktısına bakın. - TLS grup ayarlarını kontrol edin. Elle anahtar değişimi grubu seçen kod var mı, arayın.
- JFR kullanan izleme araçlarını deneyin. Gizlenen alanlara dayanan bir panel veya betik varsa boş değer görebilir.
- Bağımlılıkları güncelleyin. Derleme araçları ve bayt kodu kütüphaneleri (ASM, Byte Buddy vb.) Java 27'yi tanıyan sürümde olmalı.
Alesta WEB olarak yeni JDK sürümlerini önce test ortamında, gerçek yük altında GC günlükleriyle deniyoruz; varsayılan değişiklikleri (bu sürümdeki G1 gibi) en çok küçük sunucularda fark ediyoruz.
Sık sorulan sorular
Java 27 LTS mi?
Hayır. Son LTS sürüm Java 25. Java 27 bir sonraki sürüm çıkana kadar güncelleme alır.
Kodumu değiştirmem gerekiyor mu?
Çoğu uygulama için hayır. Kalıcı değişiklikler JVM düzeyinde. Önizleme özelliklerini kullandıysanız API değişikliklerine bakın.
Kuantum sonrası TLS performansı düşürür mü?
Hibrit anahtar değişimi el sıkışmasında biraz daha büyük mesaj gönderir; bağlantı kurulduktan sonraki veri aktarımına etkisi yok.
Java 26'dan ne farkı var?
Java 26'da HTTP/3 ve PEM önizlemesi gelmişti (Java 26 yazımız). Java 27 daha çok varsayılanları değiştiren bir sürüm.
Kaynaklar (References)
İlgili yazılar: Java 26 yenilikleri · Java 25 LTS · Web yazılım hizmetleri · İletişim
Kapak fotoğrafı: Fotis Fotopoulos / Unsplash

