İçeriğe geç
academia.sh

Kurs İleri

JVM, Eşzamanlılık ve Başarım

Bu kursun sonunda

Kursa başla

01

JVM İçyapısı

Sınıfın yükleyici hiyerarşisinden geçerek çalışma zamanına girmesi ve başlatmayı hangi iş parçacığının koşturduğu, bir değerin iş parçacığına özel mi paylaşılan mı olduğunu belirleyen bellek alanları, erişilebilirliğini yitiren nesnenin temizliğini kimin üstlendiği, sınıf dosyasında bulunmayan optimizasyon kararının hangi veriden ve hangi tarafta doğduğu.

  1. 01 Sınıf Yükleme Yükleyici hiyerarşisi yetki devriyle çalışır: bir yükleyiciye sorulan sınıfı çoğu zaman üstteki yükleyici tanımlar, kimlik yalnız `==` ile okunur. Dört tetikleyicinin üçü sınıf başlatmasını koşturur, biri (derleme zamanı sabiti okumak) hiç koşturmaz; aynı sınıfa aynı anda dokunan iki iş parçacığından yalnızca biri başlatma bloğunu çalıştırır, öbürü bitmesini bekler.
  2. 02 Bellek Alanları Aynı iş parçacığının yazdığı altı değerden üçü başka bir iş parçacığına hiç görünmez, üçü görünür — ayrımı belirleyen değerin türü değil durduğu yerdir: yerel değişken ve parametre çağrı çerçevesinde, nesne alanı ve dizi ögesi öbekte, statik alan sınıfa ait alanda durur. Paylaşılan olmak görülecek olmak değildir: bir sıralama aracı olmadan aynı okuma tanımsızdır.
  3. 03 Çöp Toplayıcılar Erişilebilirliğini yitiren bir nesnenin temizliğini kim üstleniyor: ne çağıran, ne programın oluşturduğu bir iş parçacığı — kayıtta hiç olmayan bir taraf. Güçlü referans dururken temizleme koşmaz, kaldırılınca koşar; zayıf ve hayalet referans birkaç istekte kuyruğa düşer, yumuşak referans bellek baskısı yokken direnir. `System.gc()` bir istektir, buyruk değil.
  4. 04 Anında Derleme Sınıf dosyasında hiçbir optimizasyon kararı yoktur: aynı yöntem üç yüz bin kez çağrılsa da sınıf dosyasından okunan komut listesi birebir aynı kalır. Kararı veren taraf programın kendisi değildir; kararın dayandığı alıcı tip sayısını ise koşarken çağıran iş parçacığı üretir. Bir çağrı yeri tek alıcılıdan çok alıcılıya geçtiğinde varsayım geçersizleşir — bu ders hız ölçmez, yalnız komut sayısını ve alıcı tip sayısını sayar.

02

Eşzamanlılık

Bir gövdeyi çağıranda mı başka bir iş parçacığında mı koşturduğunu belirleyen çağrı, bellek modelinin görünürlük ve sıralama sözleri, izleyici kilitlerinin ve yeniden girilebilirliğin ölçülmesi, eşzamanlılık yardımcılarının işi hangi tarafa yüklediği, yürütücü havuzunun dolduğunda görevi kime verdiği, sanal iş parçacıklarının ayrık kimlik sayısı ve gelecek tabanlı zincirlemede adımı kimin koşturduğu.

  1. 01 İş Parçacıkları ve Yaşam Döngüsü Aynı gövde run() ile çağıranda, start() ile oluşturulan bir iş parçacığında koşuyor; fark tek bir yöntem adı. Üç kesme kurulumundan yalnız biri gövdeyi durduruyor, kalan ikisi kesme çağrısı olsun olmasın aynı adıma ulaşıyor.
  2. 02 Java Bellek Modeli Sekiz yayımlama düzeneğinden dördü hem yazanın hem okuyanın harekete geçmesini istiyor, biri yükü tek başına yazana (final alan), biri tek başına okuyana (join) yüklüyor, ikisi ise görünürlük sorusunu hiç sormuyor. Senkronizasyonsuz bir alanın görünürlük kusuru koşturularak gösterilmiyor; kural olarak modelleniyor.
  3. 03 Senkronizasyon İzleyici kilidine yeniden girmek tutma sayısını 0'dan 2'ye çıkarıp geri indiriyor. Aynı senkronize yöntem aynı örnekte çağrıldığında tek kilit, iki ayrı örnekte ya da bir örnek yöntemiyle bir sınıf yönteminde çağrıldığında iki ayrı kilit devreye giriyor; üç kurulumun ikisinde kilit sayısı ikiye çıkıyor.
  4. 04 Eşzamanlılık Yardımcıları Karşılaştır-ve-ata kurgulanmış bir çakışmada üç denemede sonuca ulaşıyor ve iş boyunca çağırandan hiç ayrılmıyor. CountDownLatch ile Semaphore bekleyeni engelliyor, sayacı başka taraf düşürüyor; CopyOnWriteArrayList dört anlık görüntünün her birini değişmeden koruyor, yazan taraf her değişiklikte yeni bir dizi üretiyor.
  5. 05 Yürütücü Servisleri Aynı execute çağrısının havuz boşken kendi iş parçacığında, doluyken görevi veren iş parçacığında koşturduğu; ayrık iş parçacığı kimliği sayısının sabit havuzda çekirdek sayısıyla sınırlı kaldığı ve reddetme yordamının çağıranın seçtiği bir parametre olduğu; execute ile atılan bir istisnanın yakalanmamış istisna işleyicisine, submit ile atılanın yalnızca get çağrılınca çağırana taşındığı ölçülür.
  6. 06 Sanal İş Parçacıkları Aynı görev kümesinin sabit havuzda dörtle sınırlı kalan, sanal iş parçacığı başına bir yürütücüde görev sayısı kadar büyüyen ayrık kimliği; sanal iş parçacığının isVirtual() ile ayırt edilen gerçek bir Thread olup platform iş parçacığı olmadığı; taşıyıcının gözlemlenemediği; ThreadLocal'ın sanal iş parçacığı başına ayrı bir değer tutmasının bir bedel olduğu ölçülür.
  7. 07 Eşzamansız Bileşim Gelecek tabanlı bir zincirde her aşamayı hangi tarafın koşturduğu — tamamlanmış gelecekte çağıran, bekleyen gelecekte tamamlayan taraf, sonekli çağrıda hiç oluşturmadığımız ya da verilen bir havuz — ve aynı zincirin dört yazımda dört ayrı tarafta koşup sonucun dördünde de aynı kaldığı ölçülür. Bir aşama düşerse sonraki aşamaların atlandığı ve hatanın join'de çağırana sarmalanmış geldiği gösterilir.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat