Java'da sınıflar, özel nesneler olan sınıf yükleyicileri (class loaders) tarafından belleğe yüklenir. Her sınıf yükleyici, kendi sınıf görünürlük alanını oluşturur.
Sınıf yükleyici türleri:
$JAVA_HOME/lib/ext içindeki uzantıları yükler.Özellikler:
JVM sürecine aynı sınıfın birden fazla versiyonunu yüklemek mümkün mü ve nasıl yapılır?
Cevap: Evet, mümkündür; eğer farklı sınıf yükleyicileri kullanılırsa. Aynı FQDN'ye sahip sınıflar, farklı yükleyiciler tarafından yüklendiğinde JVM için farklı türler olarak kabul edilir.
Örnek:
ClassLoader loader1 = new URLClassLoader(new URL[]{...}); ClassLoader loader2 = new URLClassLoader(new URL[]{...}); Class clazz1 = loader1.loadClass("com.example.MyClass"); Class clazz2 = loader2.loadClass("com.example.MyClass"); System.out.println(clazz1 == clazz2); // false
Hikaye
Büyük bir sunucu sisteminde, her biri ayrı bir custom classloader ile bağlanan eklentiler kullanılıyordu. Eklentiler, kendi sınıf yükleyicileri tarafından yüklenen ortak bir arayüz üzerinden nesneleri değiş tokuş ediyordu. 'PluginApi' arayüzü, eklenti sınıf yükleyicisinden ve ana sistemden farklı türler olarak kabul edildiği için ClassCastException hatası meydana geldi.
Hikaye
Bir custom classloader aracılığıyla " sıcak" servlet yeniden yükleme girişimi, bellek sızıntılarına yol açtı — eski sınıf bellekten atılmadı, çünkü statik değişkenlerin bir yerinde hala bir referans vardı. Sonuç olarak PermGen hızlı bir şekilde doldu.
Hikaye
Dinamik modül yükleme desteğine sahip bir ürün, sistem sınıf yükleyicisini dolaylı olarak kullanıyordu ve geliştiriciler yanlışlıkla ebeveynini değiştirdi, bu da temel sınıflara (örneğin, JDK'den) erişimi kaybetmelerine yol açtı. Bu, yeni modülün standart Java sınıflarını, örneğin,
java.sql.Driveryükleyememesi durumunda çökmelere yol açtı.