15 Nisan 2015 Çarşamba

Oracle JVM specification Chapter 2: The structure of the Java Virtual Machine

http://docs.oracle.com/javase/specs/jvms/se7/html/index.html

...
2.1. The class file format

JVM'in çalıştıracağı derlenmiş java bytecode'ları işletim sistemi ve donanımdan bağımsız binary formatta class dosyalarında bulunur.
class dosyası bir class yada interface'in detaylarını içerir.
class dosya formatı chapter 4'te incelenebilir.

2.2. Data types

Java dilinde olduğu gibi JVM de iki veri tipiyle çalışır: primitif ve referans tipler.
Değişkenlerde, argümanlarda, metod dönüşlerinde primitif ve referans değerler kullanılabilir.

JVM'e göre tip kontrolleri runtime'dan önce compiler tarafından yapılmış olmalıdır.
JVM tip kontrolü yapmaz.

JVM instruction setinde Operand tiplerine göre ayrı instructionlar bulunur.
Örneğin iaddladdfadd, ve dadd operasyon kodları sırasıyla int, long, float ve double tiplerini toplamak için kullanılır.

JVM nesneleri explicit olarak destekler.
JVM'e göre bir nesne, dinamic olarak yaratılmış bir class instance'ı ya da bir array'dir
Bir nesneye verilen referans da JVM'e göre reference tipindedir. Reference tipi, nesneyi gösteren bir pointer olarak düşünülebilir.
Bir nesnenin aynı anda birden fazla referansı olabilir. Nesneler daima referans tipindeki değişkenler aracılığıyla değiştirilir ve argüman olarak verilirler.

2.3. Primitive types and values

2.4. Referans types and values
3 tür referans tipi vardır: class, interface ve array tipleri.
Bir referans tipinin default değeri null'dır.

2.5. Runtime data areas
Bunlardan bazılar JVMin yaşam döngüsü boyunca aktiftir.
Diğerleri thread bazında yaratılır, threadle beraber yokedilirler.

1. pc register
JVM aynı anda birden fazla threadi çalıştırabilir.
Her threadin kendi pc (program counter) register alanı vardır.
Her thread belirli bir anda tek bir metodu çalıştırır.
Eğer bu metod native değilse, pc registerda o anda çalıştırılan JVM instruction'ının adresi bulunur.
Metod native ise pc registerın değeri undefined yani tanımlanmamıştır.


2. JVM stacks
Her bir threadin kendisiyle aynı anda yaratılmış olan bir JVM stack'i bulunur.
Eğer yapılan işlem maksimum stack boyutunu aşarsa JVM StackOverflowError hatası verir.
Eğer yeni bir thread yaratılacakken yeterli bellek ayırılamazsa JVM OutOfMemoryError hatası verir.

3. Heap
Heap alanı bütün JVM threadleri arasında ortak kullanılan bir alandır.
Bütün class instance ve arrayler runtime sırasında burada saklanır.
JVM ile beraber yaratılır.
Garbage collector aracılığıyla nesnelere bellek ayrılması işlemi yönetilir.
Nesneler elle yokedilemez.
Eğer bir işlem kendisine ayrılandan fazla heap alanı isterse JVM OutOfMemoryError hatası verir.

4. Method area
Bütün threadler arasında ortak kullanılan bir alandır.

5. Runtime constant pool

6. Native method stacks


2.6. Frames

Her metod çağırıldığında yeni bir frame yaratılır. Metod bittiğinde yokedilir.
Frame'ler için gereken alan metodu çağıran thread'in kendi stack alanından ayrılır.
Her bir frame'de local variable'lar, operand stack'i ve runtime constant-pool referansı bulunur.
Bir frame'e başka thread'lerden erişilemez.

1. Local variables
2. Operand stacks
3. Dynamic linking
4. Normal method invokation completion
5. Abrupt method invocation completion

 2.9. Special methods

Java'da yazılan bir constructor, JVM seviyesinde bir instance initialization method'dur.
Bu metodun özel bir adı vardır: <init>
Bu ismi compiler verir.
Bu isim valid bir identifier olmadığından, <init> metodu java programı içinde direkt olarak kullanılamaz.

<init> metodu yalnızca JVM içerisinde invokespecial instruction'ı ile çağırılabilir.
Ve sadece initialize edilmemiş olan class instance'ları üzerinde çağırılabilir.

2.10. Exceptions


JVM'de exception Throwable classı ile temsil edilir. Exception throw edildiği noktada hemen kontrol değişir. Bu noktadan sonraki hiçbir işlem gerçekleştirilmez.

JVM'de exception oluşmasının 3 sebebi vardır:
1. athrow instruction'ı çalıştırılması
2. anormal bir çalışma hatası olması (array limiti aşılması, bellek aşımı vb)
3. Thread.stop metodu çağırılması ya da JVMde bir internal error olması.

Bir exception'ın birden fazla handlerı olabilir. Handler'lar exception hakkında bilgi verir.
JVM bir exception throw edildiğinde current merthod içerisinde bu exceptiona uygun tipte bir handler arar.
Uygun handler bulunursa sistem handler'ın kendi koduna geçiş yapar.
Uygun handler bulunamazsa metod aniden biter ve method invocation chain'de ilerleyerek sistem uygun bir handler aramaya devam eder.
Method invocation chain'in en tepesine kadar gidildiği halde uygun handler bulunamazsa, metodu çağıran thread terminate edilir.

2.11. Instruction set summary

Bir JVM instruction'ı tek byte'lık bir opcode ve opsiyonel operandlardan oluşur.
Bazı instructionların operandı yoktur, sadece tek byte'lık opcode'dan ibarettir.

JVM interpreter'ı şu şekilde çalışır:

do {
    atomically calculate pc and fetch opcode at pc;
    if (operands) fetch operands;
    execute the action for the opcode;
} while (there is more to do);

...

Bir instruction'da kullanılan operand sayısı ve boyutu opcode'a bağlıdır.

Hiç yorum yok:

Yorum Gönder