Bir StackOverflowError'ı yakalamaya çalıştığınızda ve aşağıdaki yöntemi bulduğunuzda ne olacağını merak ediyordum:
class RandomNumberGenerator {
static int cnt = 0;
public static void main(String[] args) {
try {
main(args);
} catch (StackOverflowError ignore) {
System.out.println(cnt++);
}
}
}
Şimdi sorum:
Bu yöntem neden '4' yazdırıyor?
Bunun System.out.println()
çağrı yığınında 3 segmente ihtiyaç duyduğundan olabileceğini düşündüm , ancak 3 numarasının nereden geldiğini bilmiyorum. Kaynak koduna (ve bayt koduna) baktığınızda, System.out.println()
normalde 3'ten çok daha fazla yöntem çağrısına yol açar (bu nedenle çağrı yığınındaki 3 segment yeterli olmaz). Hotspot VM'nin uyguladığı optimizasyonlar nedeniyle (yöntem satır içi), sonucun başka bir VM'de farklı olup olmayacağını merak ediyorum.
Düzenle :
Çıktı son derece JVM'ye özgü göründüğü için,
Java (TM) SE Çalışma Zamanı Ortamı (derleme 1.6.0_41-b02)
Java HotSpot (TM) 64-Bit Sunucu VM (derleme 20.14-b01, karma mod) kullanarak sonuç 4'ü alıyorum
Bu sorunun Java yığınını anlamaktan neden farklı olduğunu düşündüğümün açıklaması :
Sorum neden bir cnt> 0 olduğu (açıkçası System.out.println()
yığın boyutu gerektirdiği ve bir StackOverflowError
şey yazdırılmadan önce bir başkasını attığı için ) değil, neden 4, sırasıyla 0,3,8,55 veya diğerinde başka bir özel değere sahip olduğu ile ilgili değil. sistemleri.
5
, 6
ve 38
Java 1.7.0_10 ile