SORU
13 EYLÜL 2010, PAZARTESİ


Nasıl Java yığın boyutunu artırmak için?

Çalışma zamanı çağrı artırmak için nasıl bilmek için bu soruyu JVM yığın boyutu sordum. Buna bir cevap var, hem de pek çok yararlı cevaplar ve yorum yığını olması gereken durum nasıl işleyeceğini ilgili var. Yanıtların özeti ile sorumu genişletilmiş ettik.

Aslında JVM StackOverflowError olmadan çalışır gibi programlar yığın boyutunu arttırmak istedim.

public class TT {
  public static long fact(int n) {
    return n < 2 ? 1 : n * fact(n - 1);
  }
  public static void main(String[] args) {
    System.out.println(fact(1 << 15));
  }
}

İlgili yapılandırma ayarı yeterince büyük bir değer ile java -Xss... komut satırı bayrak. Program TT üzeri için OpenJDK var JVM ile bu gibi çalışır:

$ javac TT.java
$ java -Xss4m TT

Cevapları da -X... bayraklar uygulama bağımlı olduğuna işaret etti. Kullanıyordum

java version "1.6.0_18"
OpenJDK Runtime Environment (IcedTea6 1.8.1) (6b18-1.8.1-0ubuntu1~8.04.3)
OpenJDK 64-Bit Server VM (build 16.0-b13, mixed mode)

Aynı zamanda sadece tek bir iş parçacığı için bir yığın büyük (nasıl cevaplar biri olarak) belirtin. Bu java -Xss... bitti gerek yok bu iş parçacığı için bellek israf önlemek için tavsiye edilir.

Yığın program yukarıda tam olarak ihtiyaçlarını, kaçtım yani n artan bir nasıl merak ettim:

  • -Xss4m fact(1 << 15) için yeterli olabilir
  • -Xss5m fact(1 << 17) için yeterli olabilir
  • -Xss7m fact(1 << 18) için yeterli olabilir
  • -Xss9m fact(1 << 19) için yeterli olabilir
  • -Xss18m fact(1 << 20) için yeterli olabilir
  • -Xss35m fact(1 << 21) için yeterli olabilir
  • -Xss68m fact(1 << 22) için yeterli olabilir
  • -Xss129m fact(1 << 23) için yeterli olabilir
  • -Xss258m fact(1 << 24) için yeterli olabilir
  • -Xss515m fact(1 << 25) için yeterli olabilir

Java makul olan işlevi yukarıda, Kare stack başına 16 bayt kullanarak bu rakamların görünüyor.

Numaralandırma yukarıda içeriryeterli olabiliryerineyeterliyığın şartı deterministik olmadığı için , aynı kaynak dosya ve aynı ile birden çok kez -Xss... bazen başarılı ve bazen StackOverflowError bir verim. çalışan E. g. 1 << 20, -Xss18m yeterliydi 7 biterse 10 -Xss19m değildi her zaman yeterli de değil ama -Xss20m yeteri kadar (her 100 çalışan için 100). Çöp toplama, JİT tekmelemek ya da başka bir şey bu belirleyici olmayan davranışlara neden?

StackOverflowError (ve muhtemelen diğer istisnalar gibi) bu çalışma yalnızca en son 1024 öğeleri yığını gösterir bir iz yazdırılan yığını. Cevap aşağıda tam ulaşmadan bir sürü 1024'ten daha büyük olabilir) sayısını gösterir.

Cevap veren birçok kişi alternatif, daha az aynı algoritma yığını-aç uygulamaları dikkate almak iyi ve güvenli bir kodlama yöntemi olduğuna işaret etti. Genel olarak, yinelemeli fonksiyonlar (çalışma zamanı yığın yığın yerine nüfuslu alır örneğin Stack nesne kullanarak) özyinelemeli işlevler bir dizi dönüştürmek mümkündür. fact Bu özel işlev için oldukça kolay dönüştürmek mümkündür. Yinelemeli maketi gibi görünecektir:

public class TTIterative {
  public static long fact(int n) {
    if (n < 2) return 1;
    if (n > 65) return 0;  // Enough powers of 2 in the product to make it (long)0.
    long f = 2;
    for (int i = 3; i <= n;   i) {
      f *= i;
    }
    return f;
  }
  public static void main(String[] args) {
    System.out.println(fact(1 << 15));
  }
}

BİLGİNİZE, yinelemeli çözüm yukarıda gösterir, fact fonksiyon hesaplanamaz tam faktöriyel sayıları yukarıda 65 (aslında, hatta üstünde 20), çünkü Java dahili tip long taşma olur. long yerine BigInteger geri dönüş fact yeniden düzenleme büyük giriş için kesin sonuçlar da doğuracak.

CEVAP
13 EYLÜL 2010, PAZARTESİ


Hmm... bir yığın çok daha az 999MB daha benim için çalışıyor:

> java -Xss4m Test
0

(Windows 7, 17.0-b05 istemci VM oluşturmak, 6 - ilan edilen aynı sürüm bilgileri ile İLGİLENİYORUZ Linux) ile İLGİLENİYORUZ

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • eHow

    eHow

    27 NİSAN 2006
  • MrSuicideSheep

    MrSuicideShe

    9 NİSAN 2010
  • vgeller1

    vgeller1

    22 Kasım 2009