第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何增加Java堆棧的大?。?/h1>

如何增加Java堆棧的大???

慕虎7371278 2019-06-16 14:32:24
如何增加Java堆棧的大?。课覇栠@個(gè)問題是為了了解如何在JVM中增加運(yùn)行時(shí)調(diào)用堆棧的大小。我已經(jīng)得到了這個(gè)問題的答案,我還得到了許多有用的答案和評論,涉及到Java如何處理需要大型運(yùn)行時(shí)堆棧的情況。我把我的問題和答復(fù)的摘要作了補(bǔ)充。最初,我希望增加jvm堆棧大小,以便像運(yùn)行這樣的程序沒有StackOverflowError.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));   }}相應(yīng)的配置設(shè)置是java -Xss...具有足夠大值的命令行標(biāo)志。為節(jié)目TT上面,OpenJDK的JVM是這樣工作的:$ javac TT.java $ java -Xss4m TT其中一個(gè)答案也指出-X...標(biāo)志與實(shí)現(xiàn)有關(guān)。我在用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)也可以只為一個(gè)線程指定一個(gè)大堆棧(參見其中一個(gè)答案如何)。這是推薦的java -Xss...以避免將內(nèi)存浪費(fèi)在不需要內(nèi)存的線程上。我很好奇上面的程序需要多大的堆棧,所以我運(yùn)行了它n增加:-xss4m就足夠了fact(1 << 15)-xss 5米就足夠了fact(1 << 17)-Xss7m就夠了fact(1 << 18)-Xss9m就夠了fact(1 << 19)-Xss 18m就夠了fact(1 << 20)-Xss35m可以滿足fact(1 << 21)-Xss68m可以滿足fact(1 << 22)-Xss129m足以fact(1 << 23)-Xss258m足以滿足fact(1 << 24)-Xss 515米就夠了fact(1 << 25)從上面的數(shù)字來看,Java似乎為上面的函數(shù)使用了大約16個(gè)字節(jié)的堆棧幀,這是合理的。上面的枚舉包含就夠了而不是就夠了,因?yàn)槎褩R蟛皇谴_定性的:使用相同的源文件和相同的源文件多次運(yùn)行它。-Xss...有時(shí)成功,有時(shí)產(chǎn)生StackOverflowError..例如,1<20,-Xss18m10中的7次就足夠了,而且-Xss19m也不總是足夠的,但是-Xss20m就夠了(總共100次跑完100次)。垃圾收集、JIT啟動(dòng)或其他什么東西會(huì)導(dǎo)致這種不確定的行為嗎?中打印的堆棧跟蹤。StackOverflowError(也可能在其他例外情況下)只顯示運(yùn)行時(shí)堆棧中最新的1024個(gè)元素。下面的答案演示了如何計(jì)算達(dá)到的精確深度(這可能比1024大得多)。許多響應(yīng)的人指出,考慮替代的、不太需要堆棧的相同算法的實(shí)現(xiàn)是一種好的和安全的編碼實(shí)踐。通常,可以將一組遞歸函數(shù)轉(zhuǎn)換為迭代函數(shù)。Stack對象,它在堆上填充,而不是在運(yùn)行時(shí)堆棧上填充)。對于這個(gè)特殊的fact功能,很容易轉(zhuǎn)換它。我的迭代版本如下所示: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));   }}FYI,正如上面的迭代解決方案所示,fact函數(shù)無法計(jì)算65以上數(shù)字的確切階乘(實(shí)際上,甚至超過20),因?yàn)閖ava內(nèi)建類型long會(huì)溢出。重構(gòu)fact所以它會(huì)返回一個(gè)BigInteger而不是long對于大量的輸入也會(huì)產(chǎn)生精確的結(jié)果。
查看完整描述

3 回答

?
www說

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超8個(gè)贊

嗯.。它適用于我,而且堆棧的容量遠(yuǎn)遠(yuǎn)小于999 MB:

> java -Xss4m Test0

(Windows JDK 7,構(gòu)建17.0-B05客戶端VM,Linux JDK 6-與您發(fā)布的版本信息相同)


查看完整回答
反對 回復(fù) 2019-06-16
?
qq_花開花謝_0

TA貢獻(xiàn)1835條經(jīng)驗(yàn) 獲得超7個(gè)贊

我假設(shè)您是通過堆棧跟蹤中的重復(fù)行計(jì)算“1024的深度”嗎?

顯然,Throwable中的堆棧跟蹤數(shù)組長度似乎限制在1024。嘗試以下程序:

public class Test {

    public static void main(String[] args) {

        try {
            System.out.println(fact(1 << 15));
        }
        catch (StackOverflowError e) {
            System.err.println("true recursion level was " + level);
            System.err.println("reported recursion level was " +
                               e.getStackTrace().length);
        }
    }

    private static int level = 0;
    public static long fact(int n) {
        level++;
        return n < 2 ? n : n * fact(n - 1);
    }}


查看完整回答
反對 回復(fù) 2019-06-16
?
開心每一天1111

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超13個(gè)贊

如果您想使用線程堆棧大小,則需要查看HotSpot JVM上的-XSS選項(xiàng)。這在非HotSpot VM上可能有所不同,因?yàn)镴VM的-X參數(shù)是特定于發(fā)行版的,IIRC。

在熱點(diǎn)上,這看起來就像java -Xss16M如果你想要16米的尺寸的話。

類型java -X -help如果希望看到所有特定于發(fā)行版的JVM參數(shù),則可以傳入。我不確定這在其他JVM上是否同樣工作,但它會(huì)打印所有HotSpot特定的參數(shù)。

值得注意的是,我建議限制您在Java中使用遞歸方法。優(yōu)化它們并不太好-比如JVM不支持尾遞歸(參見JVM是否阻止尾調(diào)用優(yōu)化?)。嘗試重構(gòu)上面的階乘代碼,以使用while循環(huán)而不是遞歸方法調(diào)用。


查看完整回答
反對 回復(fù) 2019-06-16
  • 3 回答
  • 0 關(guān)注
  • 2053 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)