28 Temmuz 2016 Perşembe

JVM Classloader Nasıl Çalışır?




Classloader java klaslarının Java sanal makinesine(JVM) yüklenmesini sağlar. 3 farklı classloader bulunmaktadır. Peki bunlar nelerdir?

1. Bootstrap(ön yükleyici) Classloader :
  • İlk olarak çalışan classloader dir.
  • Yüklemeye \jre\lib\rt.jar konumundan başlar ve temel java klaslarını yükler.(util, lang).
  • Native olarak yazılmış, çoğunluğunda C dili kullanılmıştır.
  • Diğer tüm classloaderlerin atasıdır(Parent). Root olarak düşünebiliriz.
  • Primordial Classloader olarakta bilinir.
2. Extension Classloader :
  • İkinci olarak çalışır ve class dosyalarını yüklemeye jre/lib/ext klasöründen yada java.ext.dirs tarafından belirtilen kısımlardan başlar.
  • Atası (Parent) bootstrap classloader dir.
  • Java ile yazılmıştir.
3. Applicaton/System Classloader :
  • Son olarak system classloader çalışır.
  • Atası(Parent) extension classloader dir.
  • Genellikle uygulama bağımlı klas dosyalarını yüklemek için kullanılırlar.
  • Yüklemeye CLASSPATH ten başlar. Eğer -cp parametresi ile klas eklenmiş ise onlarıda yükler.

Classloader ler 3 temel prensibe dayanarak çalışırlar
  1. Delegation (Delegasyon-Yetkilendirme)
  2. Visibility
  3. Uniqueness (Eşsizlik)
Delegation: Bir loader eğer yükleme yapacaksa atalarına bildirmeden yükleme yapamaz.
Sözde kod ile anlatacak olursak :  
  1. Extension classloader hmenn klasini yüklemek ister
  2. Parenti olarak bootstrapa aynı klasın önceden yüklenme durumunu sorar.
  3. Eğer yüklenmemişse yükler, yüklendiyse yükleme işlemini iptal eder.
Bu durum system classloader içinde geçerlidir. Klasın daha önceden yüklenme durumunu parentlerine sırayla sorar.

Visibility: Bir loader parenti tarafından yüklenen klasları görebilir ama parent(ata) child(çocuk) ların yüklediğini göremez.

Uniqueness: Aynı isimde 2 klas yüklenemez. Delegasyondandaki sorgulama evresi ile bunun önüne geçilir.

Kendimiz RUNTIME esnasında nasıl klas yükleriz ?

Java klas yüklememiz için bize bir API sağlar. Bu API aracılığıyla Class.forName(klasAdi) metodu ile klas yükleyebiliriz. Bu işlem sırasıyla şöyle gerçekleşir.

  1. loadClass() metodu çalışır ve jar dosyaları arasında klası arar.
  2. Eğer klas var ise yüklemeyi gerçekleştirir.
  3. Eğer yok ise ClassNotFoundException fırlatır.




Hiç yorum yok:

Yorum Gönder