Java İle Java Flight Recorder Kullanarak Performans Analizi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Java Flight Recorder, Java 11 ve sonraki sürümlerde tamamen açık kaynaklı ve ücretsiz olarak sunulmaktadır. JFR'yi etkin bir şekilde kullanabilmek için aşağıdaki ortamın hazır olduğundan emin olmalısınız:

  • Java Sürümü: JDK 17 veya 21 gibi güncel bir LTS (Long Term Support) sürümü.
  • İzleme Aracı: Kaydedilen .jfr dosyalarını görselleştirmek için JDK Mission Control (JMC).
  • Erişim Yetkisi: Uygulamanın çalıştığı sunucuda dosya yazma ve JVM parametrelerini yönetme yetkisi.

JFR, çok düşük bir izleme maliyetine (genellikle %1'in altında CPU etkisi) sahip olduğu için üretim ortamlarında güvenle kullanılabilir. Ancak, çok yüksek frekanslı olayları kaydetmek sistemin I/O (Giriş/Çıkış) yükünü artırabilir; bu nedenle ayarların dikkatli yapılandırılması önerilir.

Java Flight Recorder Nasıl Etkinleştirilir?

JFR'yi uygulamanıza iki farklı şekilde dahil edebilirsiniz: Uygulama başlangıcında JVM parametreleri ile veya çalışma zamanında (runtime) jcmd aracı ile. İlk adım olarak uygulama başlangıcında nasıl kaydedeceğinizi inceleyelim.

java -XX:StartFlightRecording=filename=kayit.jfr,duration=60s,settings=profile -jar uygulama.jar

Yukarıdaki komut, uygulamanız başladığında 60 saniyelik bir kayıt başlatır ve bunu kayit.jfr dosyasına yazar. settings=profile parametresi, detaylı bir analiz için gerekli olan tüm olayları (events) etkinleştirir.

Çalışma Zamanında JFR Kaydı Başlatma

Uygulamanız zaten çalışıyorsa ve anlık bir performans sorunu yaşıyorsanız, uygulamanızı yeniden başlatmanıza gerek kalmadan JFR'yi devreye alabilirsiniz. Bunun için JDK ile gelen jcmd aracını kullanırız.

# Önce çalışan Java süreçlerinin ID'sini bulun
jcmd

# JFR kaydını başlatın (PID yerine kendi sürecinizin numarasını yazın)
jcmd  JFR.start duration=120s filename=analiz.jfr

Bu komut, çalışan bir JVM üzerinde 120 saniyelik bir kayıt süreci başlatır. Kayıt bittiğinde, oluşan analiz.jfr dosyasını JDK Mission Control ile açarak detaylı incelemeye başlayabilirsiniz.

Programatik Olarak Özel Olaylar (Custom Events) Oluşturma

Standart JVM olaylarının yanı sıra, kendi iş mantığınızdaki performans darboğazlarını ölçmek için özel olaylar tanımlayabilirsiniz. Bu, özellikle veritabanı sorguları veya dış servis çağrıları gibi kritik noktaları izlemek için mükemmeldir.

import jdk.jfr.Event;
import jdk.jfr.Label;
import jdk.jfr.Description;

@Label("Veritabani Sorgusu")
@Description("Sorgu süresini ve sonucunu ölçer")
class VeritabaniOlayi extends Event {
    String sorguDetayi;
}

// Kullanımı:
VeritabaniOlayi olay = new VeritabaniOlayi();
olay.begin();
try {
    // Sorgu işlemleri
    olay.sorguDetayi = "SELECT * FROM kullanicilar";
} finally {
    olay.commit();
}

Bu kod bloğu, JFR'nin standart raporlarına kendi özel metriklerinizi eklemenizi sağlar. @Label ve @Description anotasyonları, JMC üzerinde bu olayın daha anlaşılır görünmesine yardımcı olur.

Performans Analizi Yöntemlerinin Karşılaştırılması

Performans analizi yaparken kullanılan farklı araçların avantaj ve dezavantajlarını anlamak, doğru aracı seçmenize yardımcı olur.

Yöntem Avantajı Dezavantajı
JFR (Flight Recorder) Çok düşük overhead, detaylı JVM içi veri Dosya boyutu hızlı büyüyebilir
JVisualVM Görsel ve kolay kullanım Üretim ortamı için ağır olabilir
Async-profiler Çok düşük CPU etkisi Kurulumu ve kullanımı daha teknik

JFR Verilerini Analiz Etme: JDK Mission Control

Kaydettiğiniz .jfr dosyasını analiz etmek için JDK Mission Control (JMC) arayüzünü açın. JMC, "Automated Analysis" (Otomatik Analiz) sekmesi ile size sistemdeki olası sorunları (örneğin: "Garbage Collection duraklamaları çok uzun") otomatik olarak raporlar.

Analiz sırasında özellikle şu sekmelere odaklanın:

  • Memory: Heap kullanımı ve nesne tahsis (allocation) oranları.
  • Threads: Hangi thread'in ne kadar süreyle bloklandığı veya beklediği.
  • Code: En çok CPU tüketen metodlar (Hot Methods).

Sıkça Sorulan Sorular

JFR üretim ortamında sistemi yavaşlatır mı?

JFR, minimum performans kaybı (genellikle %1'den az) için tasarlanmıştır. "Profile" ayarı yerine "Default" ayarını kullanırsanız bu etki neredeyse hissedilmez düzeydedir.

JFR dosyaları ne kadar yer kaplar?

Kayıt süresine ve toplanan olayların yoğunluğuna bağlıdır. Genellikle dakikada birkaç megabayt yer kaplar. Disk alanı sorunu yaşamamak için maxsize parametresini kullanabilirsiniz.

JFR ile bellek sızıntısı (memory leak) bulunur mu?

Evet. "Memory" sekmesi altındaki "Allocation in new TLAB" verilerini inceleyerek, hangi sınıfların en çok bellek tükettiğini ve bu nesnelerin ömrünü analiz edebilirsiniz.

JFR verilerini dışarı aktarabilir miyim?

Evet, JFR dosyaları ikili (binary) formattadır ancak jfr komut satırı aracı ile bu dosyaları JSON veya CSV formatına dönüştürerek diğer analiz araçlarına aktarabilirsiniz.

JFR sadece Java kodunu mu izler?

JFR, JVM'in kendisini, işletim sistemi etkileşimlerini ve Java kodunu bir bütün olarak izler. Bu sayede sadece uygulama kodunuzu değil, JVM'in alt seviye davranışlarını da görebilirsiniz.

Kritik Güvenlik Uyarısı: JFR kayıt dosyaları, uygulamanızın çalışma zamanındaki verilerini içerir. Bu dosyalar içerisinde hassas değişken değerleri (örneğin veritabanı şifreleri veya kişisel veriler) loglanmış olabilir. Kayıt dosyalarını analiz ederken veya paylaşırken bu verilerin maskelenmiş olduğundan emin olun ve dosyaları güvenli ortamlarda saklayın.

JFR ile Otomatikleştirilmiş Performans İzleme ve CI/CD Entegrasyonu

JFR kayıtlarını manuel olarak başlatmak ve analiz etmek, geliştirme aşamasında oldukça faydalıdır. Ancak, büyük ölçekli sistemlerde veya üretim ortamlarında performans regresyonlarını tespit etmek için bu süreci otomatikleştirmek gerekir. JFR verilerini CI/CD süreçlerine dahil ederek, her yeni dağıtımın performans üzerindeki etkisini ölçebilirsiniz.

Otomatik Kayıt Başlatma ve Döngüsel Arabellek Yönetimi

Uygulamanızın her zaman "kara kutu" verisine sahip olmasını istiyorsanız, JVM başlatma parametrelerine döngüsel (circular) bir kayıt mekanizması ekleyebilirsiniz. Bu yöntem, disk alanını tüketmeden son X saatin performans verisini elinizde tutmanızı sağlar.

# JVM Başlatma parametreleri
-XX:StartFlightRecording=disk=true,dumponexit=true,filename=recording.jfr,maxage=1h,maxsize=500m

Bu konfigürasyon ile sisteminizde bir hata oluştuğunda veya JVM kapandığında, son 1 saatlik veriyi içeren 500MB'lık bir dosya otomatik olarak oluşturulur. Bu, özellikle "post-mortem" (olay sonrası) analizler için kritik bir öneme sahiptir.

JFR Verilerini Komut Satırı ile Sorgulama: jcmd ve jfr Araçları

JDK Mission Control (JMC) görsel bir arayüz sunsa da, otomasyon scriptleri yazarken veya sunucu üzerinde hızlıca veri filtrelemek istediğinizde komut satırı araçları (CLI) vazgeçilmezdir. jfr aracı, kayıt dosyalarını parçalara ayırmanıza veya belirli olayları metin formatında dışarı aktarmanıza olanak tanır.

Kayıt Dosyası İçeriğini Filtreleme

Bir kayıt dosyasındaki tüm olayları görmek yerine, sadece belirli bir eşik değerin üzerindeki olayları (örneğin 100ms'den uzun süren saf dışı bırakma işlemleri) filtrelemek için aşağıdaki komutu kullanabilirsiniz:

# 100ms'den uzun süren olayları listele
jfr print --events jdk.GCPhasePause --where "duration > 100 ms" recording.jfr

Performans Analizi İçin İleri Düzey İpuçları

  • Stack Trace Örneklemesi: Eğer uygulamanızda CPU kullanımı yüksekse, jdk.ExecutionSample olayını inceleyin. Bu olay, uygulamanın hangi metodlarda en çok vakit geçirdiğini istatistiksel olarak gösterir.
  • Soket ve Dosya G/Ç: Uygulamanızın veritabanı veya ağ gecikmelerinden etkilenip etkilenmediğini anlamak için jdk.SocketRead ve jdk.FileRead olaylarını takip edin.
  • Özel Olayların Performansı: Çok sık tetiklenen (saniyede binlerce kez) özel olaylar oluşturmaktan kaçının. Bu durum, JFR'nin kendisinin performans darboğazı yaratmasına neden olabilir.
Metrik İzlenecek Olay (Event) Kritik Eşik
CPU Kullanımı jdk.ExecutionSample %80 ve üzeri
GC Duraklaması jdk.GCPhasePause > 200ms
Bellek Tahsisi jdk.ObjectAllocationInNewTLAB Saniye başına yüksek oran

Bu teknikleri kullanarak, uygulamanızın performansını sadece "hissedilen" bir yavaşlıktan çıkarıp, veriye dayalı somut bir iyileştirme sürecine dönüştürebilirsiniz. Unutmayın, en iyi performans analizi, sistemin normal çalışma koşullarında nasıl davrandığını bildiğinizde başlar.

Sonuç

Java Flight Recorder, Java ekosistemindeki en güçlü performans analiz araçlarından biridir. Bu rehberde, JFR'yi nasıl başlatacağınızı, özel olaylar ile nasıl zenginleştireceğinizi ve JDK Mission Control ile nasıl analiz edeceğinizi öğrendiniz. Bir sonraki adım olarak, kendi uygulamanızda bir "Memory Leak" senaryosu oluşturup, JFR ile bu sızıntının kaynağını tespit etmeye çalışarak pratik yapmanızı öneririm. Performans analizi, sürekli geliştirilen ve derinleşen bir beceridir; JFR'yi günlük geliştirme süreçlerinize dahil ederek uygulamalarınızın kalitesini artırabilirsiniz.

Bu yazıya tepkinizi paylaşın:
Zeynep Arslan

Kullanıcı deneyimi odaklı içerik üretiminde uzmanlaşmış bir editörüm. Özellikle DIY projeleri ve teknik rehberler üzerine detaylı içerikler üretiyorum.

Yorumlar (0)

Yorum Yaz