SORU
24 Temmuz 2013, ÇARŞAMBA


Neden bu yöntem 4 baskı yapar?

Bir StackOverflowError yakalamaya çalıştığın zaman neler olduğunu merak ettim ve aşağıdaki yöntem ile geldi:

class RandomNumberGenerator {

    static int cnt = 0;

    public static void main(String[] args) {
        try {
            main(args);
        } catch (StackOverflowError ignore) {
            System.out.println(cnt  );
        }
    }
}

Şimdi sorum şu:

Neden bu yöntem baskı yapıyor '4'?

Belki de System.out.println() çağrı üzerine 3 parça yığını ihtiyacı var çünkü. ama 3 nereden geldiğini bilmiyorum sanıyordum. Bak kaynak kodu (Java) System.out.println(), normalde kurşun için çok fazla yöntem çağırmaları daha 3 (3 kesimlerindeki çağrı yığını olmaz yeterli). Eğer Noktasal VM geçerlidir iyileştirme (yöntem satır içi uygulaması) olsaydı, sonuç başka bir VM üzerinde farklı olurdu merak ediyorum.

Edit:

Çıkış JVM çok özel görünüyor, sonucu 4 kullanıyorum
(TM) SE çalışma Zamanı Ortamı (yapı 1.6.0_41-b02) Java
Java Fi(TM) 64-Bit Server VM (20.14-b01, karma mod kurmak)


Bu soru Understanding java stack farklı sanırım o yüzden açıklama:

Benim sorum cnt bir ^ var neden ilgili değil . 0 (açıkçası çünkü System.out.println() gerektirir yığın boyutu ve atar başka StackOverflowError Daha önce bir şey alır baskılı), ama neden olduğu belli değeri 4, sırasıyla 0,3,8,55 veya başka bir şey üzerinde Diğer sistemler.

CEVAP
24 Temmuz 2013, ÇARŞAMBA


Diğerleri cnt ^ neden açıklayan iyi bir iş yapmış bence . 0, ama yeterince cnt neden ile ilgili ayrıntılar yok cnt çok yaygın olarak farklı ayarlar arasında değişir neden = 4, ve. İşte bu boşluğu doldurmaya çalışacağım.

İzin verin

  • X toplam boyutu yığını
  • Uzay stak M ana ilk kez girdiğimizde kullanılır
  • R yığın alanı ana içine girmek her zaman artırın
  • Alan gerekli System.out.println çalıştırmak için stak P

Biz ilk ana içine almak zaman, uzay arta kalan X-M. Her özyinelemeli çağrı alır R Daha fazla bellek. Yani 1 özyinelemeli çağrı (1 fazla özgün), bellek kullanımı M. R. Varsayalım StackOverflowError atılır sonra C başarılı özyinelemeli aramaları, M C * R <= X ve M C * (R 1) >İlk StackOverflowError sırasında X, X - M - C * R Hatıra kalmadı.

System.out.prinln, çalıştırmak edebilmek için ihtiyacımız P alanı miktarı yığında bıraktı. Eğer X - M - C-R*^. öyle bir şey olursa = P, 0 yazdırılır. Eğer P Daha fazla yer gerektiriyorsa, o zaman biz cnt pahasına, kazanmak yığın R hafızasından çerçeveleri Kaldır .

println son olarak çalıştırmak mümkün olduğunda, X - M - C - cnt) * R >P, belirli bir sistem için büyükse, cnt büyük olacak Yani = P..

Hadi bazı örnekler bakin.

Örnek 1:Sanırım

  • X = 100
  • = 1 M
  • R = 2
  • P = 1

O zaman C = floor((X-M)/R) = 49, ve cnt = tavan ((- (X - M - C*R) S)/R) = 0.

Örnek 2:Varsayın

  • X = 100
  • = 1 M
  • R = 5
  • = 12 P

O zaman C = 19 ve cnt = 2.

Örnek 3:Varsayın

  • X = 101
  • = 1 M
  • R = 5
  • = 12 P

O zaman C = 20, ve cnt = 3.

Örnek 4:Varsayın

  • X = 101
  • M = 2
  • R = 5
  • = 12 P

O zaman C = 19 ve cnt = 2.

Böylece sistemi (M, R ve P) ve yığın boyutu (X) cnt etkiler.

Bir yan not olarak, catch başlatmak için gerektirir ne kadar önemli değildir. Artırmaz cnt catch, o zaman için yeterli alan yok sürece, yani dış etkileri vardır.

EDİT

I catch hakkında söylediklerimi geri alıyorum. Bir rolü var. Alanı T miktarını başlatmak için gerekli sanırım. cnt başlar artım zaman kalan alan daha büyük T println çalıştığında kalan alan daha büyük T P. Bu ekler fazladan adım için hesaplamalar ve daha muddies kadar zaten çamurlu analizi.

EDİT

Sonunda zaman bazı deneyler teorim yedeklemek için çalıştırmak için bulundu. Ne yazık ki, bu teori deneyler ile uyumlu görünmüyor. Aslında ne çok farklıdır.

Deney düzeneği: Ubuntu 12.04 varsayılan java ve varsayılan sunucu ile ilgileniyoruz. Xss 1 70,000 başlayarak 460,000 katları bayt.

Mevcut sonuçlar: https://www.google.com/fusiontables/DataSource?docid=1xkJhd4s8biLghe6gZbcfUs3vT5MpS_OnscjWDbM Her yinelenen veri noktası uzaklaştırıldığı başka bir versiyonunu yarattım. Diğer bir deyişle, önceki farklı olan tek noktaları gösterilir. Bu anomaliler daha kolay görmek için yapar. https://www.google.com/fusiontables/DataSource?docid=1XG_SRzrrNasepwZoNHqEAKuZlHiAm9vbEdwfsUA

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Avast

    Avast

    27 NİSAN 2006
  • EmbarkToHeaven

    EmbarkToHeav

    3 EYLÜL 2007
  • PlugResearch

    PlugResearch

    22 Mart 2006