Java necə işləyir

Mövzu seç, kod yaz və daxildə nə baş verdiyini addım-addım gör.

Memory

Collection-lar

Concurrency

Dil və JVM

Mövzular

Bytecode

JVM bir stack machine-dir

javac Java-nı bytecode-a çevirir, javap -c onu göstərir. CPU register-ləri əvəzinə JVM hər frame-də kiçik bir operand stack işlədir.

Hər instruction dəyəri stack-ə qoyur və ya oradan götürür. a + b üçün iki dəyər qoyulur, iadd onları götürüb nəticəni qoyur.

Local variable-ların adı yoxdur, slot nömrəsi var: istore_0 0-cı slot-a yazır.

javac əvvəlcədən hesablayır

Burada 1 + 2 yazılıb, amma bytecode-da toplama yoxdur: iconst_3. Sabit ifadəni compiler özü hesablayır.

Eyni qayda "a" + "b" üçün də keçərlidir: nəticə bir literal olur. Ona görə "ab" == "a" + "b" true-dur.

i = i++ tələsi

Bu kod i-ni dəyişmir, nəticə 5-dir. Addımlara bax: iload_0 köhnə 5-i stack-ə qoyur, iinc i-ni 6 edir, istore_0 isə köhnə 5-i geri yazır.

Düymə ilə i = ++i-yə keç: sıra dəyişir, əvvəl iinc, sonra iload_0. Nəticə 6 olur.

Dövrə: if və goto

Bytecode-da for yoxdur, şərtli və şərtsiz keçid var. if_icmpgt stack-dən iki dəyər götürür və müqayisə edir, goto geri qayıdır.

Diqqət et: şərt tərsinədir. i <= 3 üçün “i > 3-dürsə, çıx” yazılıb.

Method çağırışı: yeni frame

Çağıran method arqumenti stack-ə qoyur. invokestatic yeni frame yaradır və dəyər onun 0-cı slot-una keçir.

ireturn frame-i silir və nəticəni çağıranın operand stack-inə qoyur. Stack overflow bu frame-lərin dolmasıdır.

finally necə işləyir?

Bu method 2 yox, 1 qaytarır. javac qaytarılacaq dəyəri əvvəlcə ayrıca slot-a yazır (saved), sonra finally kodunu işlədir, sonra saved-i qaytarır.

finally bytecode-da ayrıca blok deyil: kod hər çıxış yoluna kopyalanır. Exception yolu 8-ci sətirdən başlayır, burada exception olmadığı üçün işləmir.

Autoboxing görünür

Java kodunda Integer.valueOf yazılmayıb, amma bytecode-da var. Integer b = 4 əslində Integer.valueOf(4)-dür, Integer cache də buradan işləyir.

b + 1 üçün əvvəl intValue() çağırılır. b null olsaydı, NullPointerException burada yaranardı.

String birləşməsi də oxşardır: a + "!" invokedynamic ilə makeConcatWithConstants olur.