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
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
Nasıl bir android Uygulama yığın boyut...
Artırmak için nasıl yığın taşma hatası...
Nasıl Java metin editörleri için Eclip...
Nasıl böyle büyük mükafat düzenleyici ...
Java yığın boyutunu artırmak...