Java nasıl çalışır

Konu seç, kod yaz ve içeride ne olduğunu adım adım gör.

Memory

Collection'lar

Concurrency

Dil ve JVM

Konular

Bytecode

JVM bir stack machine'dir

javac Java'yı bytecode'a çevirir, javap -c onu gösterir. CPU register'ları yerine JVM her frame'de küçük bir operand stack kullanır.

Her instruction değeri stack'e koyar veya oradan alır. a + b için iki değer konur, iadd onları alıp sonucu koyar.

Local variable'ların adı yoktur, slot numarası vardır: istore_0 0. slot'a yazar.

javac önceden hesaplar

Burada 1 + 2 yazıyor, ama bytecode'da toplama yok: iconst_3. Sabit ifadeyi compiler kendisi hesaplar.

Aynı kural "a" + "b" için de geçerlidir: sonuç tek literal olur. Bu yüzden "ab" == "a" + "b" true olur.

i = i++ tuzağı

Bu kod i değerini değiştirmez, sonuç 5'tir. Adımlara bak: iload_0 eski 5'i stack'e koyar, iinc i değerini 6 yapar, istore_0 ise eski 5'i geri yazar.

Düğmeyle i = ++i kodlarına geç: sıra değişir, önce iinc, sonra iload_0. Sonuç 6 olur.

Döngü: if ve goto

Bytecode'da for yoktur, koşullu ve koşulsuz geçiş vardır. if_icmpgt stack'ten iki değer alır ve karşılaştırır, goto geri döner.

Dikkat et: koşul terstir. i <= 3 için “i > 3 ise çık” yazılır.

Method çağrısı: yeni frame

Çağıran method argümanı stack'e koyar. invokestatic yeni frame oluşturur ve değer onun 0. slot'una geçer.

ireturn frame'i siler ve sonucu çağıranın operand stack'ine koyar. Stack overflow bu frame'lerin dolmasıdır.

finally nasıl çalışır?

Bu method 2 değil, 1 döndürür. javac döndürülecek değeri önce ayrı bir slot'a yazar (saved), sonra finally kodunu çalıştırır, sonra saved değerini döndürür.

finally bytecode'da ayrı bir blok değildir: kod her çıkış yoluna kopyalanır. Exception yolu 8. satırdan başlar, burada exception olmadığı için çalışmaz.

Autoboxing görünür

Java kodunda Integer.valueOf yazmıyor, ama bytecode'da var. Integer b = 4 aslında Integer.valueOf(4) çağrısıdır, Integer cache de buradan çalışır.

b + 1 için önce intValue() çağrılır. b null olsaydı NullPointerException burada oluşurdu.

String birleştirme de benzerdir: a + "!", invokedynamic ile makeConcatWithConstants olur.