5 Mart 2014 Çarşamba

JVM Havuzları

Not : JVM ile ilgili tanımlamaları burada gördüğüm sözlükten okumak mümkün.

Komut Satırından Java Kaynak Dosyaları Derlemek
src altındaki bazı kaynak dosyaları derlemek için

set sourcefiles = src\main.java src\another.java
javac -d bin -cp lib\myjar.jar;lib\myotherjar.jar -sourcepath src -verbose %sourcefiles%


Java ClassPath
JVM ile alakası yok ancak not almak istedim. Bir jar dosyasını çalıştırmak için iki yol var. İlkinde CLASSPATH ortam değişkeni ile yüklenecek jar dosyalarının bulunduğu dizin belirtilir. Örnek:

set CLASSPATH=D:\Mylib\
Daha sonra java MyApp şeklinde çalıştırılır. 

İkincisinde ise jar dosyaları -cp ile belirtilir. Örnek:


Linux'ta ; yerine : karakteri kullanılır.Örnek:

Daha sonra yine aynı şekilde java MyApp şeklinde çalıştırılır.
 
Young Generation Nedir?

Bir çok nesnenin çok kısa süreliğine kullanılıp tekrar yok olacağı farz ediliyor. Bu kısa ömürlü nesneler Young Generation denilen havuzda toplanırlar. Young Generation iki kısımdan oluşuyor. Eden ve Survivor.

Eden:
Burada anlatıldığına göre Eden ismi nesneler burada doğdukları için verilmiş. Eğer nesne hayatta kalırlarsa "Young Generation" içindeki diğer alanlara  gönderilirler.

 Survivor:
Survivor da kendi içinde to ve from isimli iki havuzdan oluşuyor.

 
Permenant Generation Nedir ?
Bu konuda bir sürü karmaşık yazı var. Benim anladığım işin özeti şöyle. Eğer bir yazılımda çok fazla yüklenecek class ya da string varsa bazen bu hata alınabiliyor. Tek yapılması gereken -XX:MaxPermSize=128M gibi bir parametre ile daha yüksek bir değer vermek.

-Xmx işe yaramaz ! Boşuna uğraşmayın...

Burada da classloader'ın nasıl çalıştığı anlatılıyor.

Aşağıda buradan aldığım bir şekil var ve durumu çok güzel anlatıyor.
Manifest Dosyası
Permenant Generation içine yüklenen class bilgilerinin bazısı jar dosyası içindeki manifest dosyasından gelir. META-INF/MANIFEST.MF dizinindeki dosyada jar yüklenirken çalıştırılan satırlar bulunur.
Main-Class:

jar -cp classpath -jar my.jar komutu ile çalıştırılan bir jar'ın giriş sınıfını bu satırda belirtiriz.

Class-Path:
Jar dosyasının ihtiyacı olan diğer jar dosyalarını belirtir. Örnek:

Tüm Heap

Tüm Heap'in büyüklüğünü almak için aşağıdaki kod parçası çalıştırılabilir.

Runtime rt = Runtime.getRuntime();
long maxMb = rt.maxMemory()/(1024*1024);
Old Generation Nedir?

Uzun ömürlü nesneler Old Generation denilen havuzda toplanırlar.


Young + Old Generation Büyüklüğünü Ayarlamak

-Xms500m : Bu alanın başlangıç büyüklüğünü ayarlar.
why jvm consume less memory than -Xms speicified? sorusunda da gösterildiği gibi top komutuyla bakılınca VIRT sütunu altındaki değer -Xms ile atanan değerden daha büyük olmalı.

-Xmx1024m : Bu alanın azami büyüklüğünü ayarlar
Bu ayarlar ile java.lang.OutOfMemoryError: Java heap space diye başlayan exceptionlardan genellikle kurtulmak mümkün oluyor.

32 bit JVM'ler için bu alanın alacağı en büyük değer -Xmx1628m civarında. Yani 1.6 gigabyte.

Young + Old Generation Büyüklüğünü Yüzde Olarak Ayarlamak

JVM hafıza alanlarını işletim sisteminden bir kere alınca, normal şartlar altında kullanmasa bile işletim sistemine iade etmek zorunda değildir. Ancak

-XX:MinHeapFreeRatio (default is 40)   ve
-XX:MaxHeapFreeRatio (default is 70)

seçenekleri ise kullanılmayan alanın geri verilmesi sağlanabilir. Örneğin ilk açılışta çok bellek lazımdır ve üst sınır yüksek tutulmalıdır. Ancak daha sonra bu kadar bellek gerekmez ve "boş alan" miktarı artar. Bu durumda JVM kullanmadığı alanları işletim sistemine geri verirse, diğer uygulamalar daha rahat çalışırlar.

Garbage Collector
GC için tek thread çalışır.

Garbage Collection ve Strong Reference

Strong Reference bir nesneye Root Set tarafından direkt erişilebilmesi demek. Bu tür nesneler GC tarafından yok edilmezler. Aşağıdaki şekilde Root Set tarafından Strong Reference ile erişilebilen nesneleri görmek mümkün.

Bir diğer şekilde ise aynı durumu bu sefer GC tarafından yok edilecek nesneler ile birlikte görmek mümkün. Özellikle birbirine strong reference ile bağlı olan 3 nesnenin oluşturduğu adacığın Root Set'e bağlı olmadıkları için kırmızı ile işaretlendiğine dikkat etmek lazım.


Thread'ler bir şekilde çalıştıkları müddetçe, strong reference'a sahipler. Thread yarattıktan sonra, herhangi bir referans tutulmasa bile, thread nesnesi çalıştığı müddetçe garbage collection'a uğramaz.

Garbage Collector Tarafından Çağırılan Metodlar
Bir nesne yok edilirken Java'da finalize(), C#'ta ise Dispose() metodu çağırılıyor. Bu metodların içinde unmanaged resource'lar varsa onları serbest bırakmak mümkün.

Java finalize metodu
Garbage collection varsa finalize metodundan bahsetmeden geçmek olmaz. finalize metodunu kullanmaktan kaçınmak lazım ancak illaki kullanılması gerekiyorsa Do you call super.finalize() within a subclass? sorusunda da cevaplandığı gibi her sınıf kendi üst sınıfının da finalize metodunu çağırmalı.
C# Dispose Metodu
Bu metodu gerçekleştirmek için  IDisposable arayüzünden türemek gerekir.

C#'ta Dispose İşleminin Hemen Çağırılması
using ifadesi içine bir veya daha çok sınıf verilerek kod bloğundan çıkınca kaynakların hemen bırakılması sağlanabilir. Örnek:


Java'da şu anda using benzeri bir kullanım yok ancak Java 7'de buradaki gibi olacak.

Java Closeable Arayüzü
Java'da C#'taki gibi using kullanımı yok ancak bazı sınıflar için özel bir arayüz geliştirilmiş.
Özellikle stream sınıfları Closeable arayüzünden türüyorlar. Bu arayüz ile finalize metodunun çalıştırılmasını beklemeden stream kapatılabiliyor ve kaynaklar serbest kalabiliyor. Closeable arayüzü close() metodunda IOException attığı için daha çok stream'ler için düşünülmüş. Örneğin ResultSet  veya socket sınıfları close() metodları olmasına rağmen bu arayüzü kullanmıyorlar.
 
JVM Environment Variables
Windows altında heap boyunu ayarlamak için eğer Oracle JVM kullanılıyorsa _JAVA_OPTIONS değişkeni atanabilir.
Headless Mode
Bu modda çalıştırılan java uygulamasına display ve keyboard verilmez. Örnek:

jps
JVM ile çalışan programları görmek için jps kullanılabilir. jps JDK dizini altında bulunur. Örneği benim bilgisayarımda C:\Program Files (x86)\Java\jdk1.7.0_02\bin dizini altında bulunuyor.

Hiç yorum yok:

Yorum Gönder