亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么遞歸函數在隨機數上停止?

為什么遞歸函數在隨機數上停止?

慕碼人2483693 2022-08-03 10:37:06
我寫了一個小程序,如下所示,它計算無限遞歸循環在導致StackOverflow錯誤之前將經過多少次。public class Testing {    static void p(int i) {        System.out.println("hello" + i);        i++;        p(i);    }    public static void main(String[] args) {        p(1);    }}問題是,它每次都會在不同的數字上出錯,通常在8000和9000之間。誰能解釋為什么會發生這種情況?編輯:我正在使用Eclipse IDE,還沒有用其他IDE或命令行測試過它。
查看完整描述

4 回答

?
慕哥6287543

TA貢獻1831條經驗 獲得超10個贊

StackOverflowError當堆棧(存儲方法執行堆棧的內存的一部分)與堆(分配對象,基元等的內存)發生沖突時,將引發。您無法預測何時引發錯誤,因為除非由 flag 指定,否則堆棧的大小可以是動態的。這就是為什么沒有固定的方法執行深度,這會導致.-XssStackOverflowError



查看完整回答
反對 回復 2022-08-03
?
Smart貓小萌

TA貢獻1911條經驗 獲得超7個贊

JVM規范很好地解釋了它與堆棧相關的行為;

每個 Java 虛擬機線程都有一個私有 Java 虛擬機堆棧,與該線程同時創建。Java 虛擬機堆棧存儲幀 (§2.6)。Java虛擬機堆棧類似于傳統語言(如C)的堆棧:它保存局部變量和部分結果,并在方法調用和返回中發揮作用。由于 Java 虛擬機堆棧除了推送和彈出幀外,從不直接操作,因此可以堆分配幀。Java 虛擬機堆棧的內存不需要是連續的。

在 Java? 虛擬機規范的第一版中,Java 虛擬機堆棧被稱為 Java 堆棧。

此規范允許 Java 虛擬機堆棧具有固定大小,或者根據計算需要動態擴展和收縮。如果 Java 虛擬機堆棧的大小是固定的,那么在創建每個 Java 虛擬機堆棧時,可以獨立選擇該堆棧的大小。

Java 虛擬機實現可以為程序員或用戶提供對 Java 虛擬機堆棧初始大小的控制,以及在動態擴展或收縮 Java 虛擬機堆棧的情況下,控制最大和最小大小。

以下異常情況與 Java 虛擬機堆棧相關聯:

如果線程中的計算需要的 Java 虛擬機堆棧大于允許的堆棧,則 Java 虛擬機會引發 StackOverflowError。

如果可以動態擴展 Java 虛擬機堆棧,并且嘗試擴展,但沒有足夠的內存可用于實現擴展,或者如果沒有足夠的內存可用于為新線程創建初始 Java 虛擬機堆棧,則 Java 虛擬機將拋出一個 OutOfMemoryError。

就您的問題而言,本摘錄中的一個重要觀點是:

  • 此規范允許 Java 虛擬機堆棧具有固定大小,或者根據計算需要動態擴展和收縮。

由于您沒有提供堆棧大小,因此 JVM 會嘗試動態擴展堆棧大小,因為該函數被遞歸調用,需要更多的堆棧內存。在每次運行中,它可能會為其堆棧找到不同數量的動態內存,具體取決于該運行點計算機上內存的可用性。這就是您在引發 SO 錯誤之前看到的迭代次數的不同值的原因。如果為程序配置(使用 JVM 參數)較小的堆棧大小,則在 SO 錯誤之前,您應該會看到大致相同的遞歸數。Xss<size>


查看完整回答
反對 回復 2022-08-03
?
吃雞游戲

TA貢獻1829條經驗 獲得超7個贊

可能與計算機可以分配給程序的實際內存量有關,而其他程序和進程正在計算機中運行


查看完整回答
反對 回復 2022-08-03
?
守著一只汪

TA貢獻1872條經驗 獲得超4個贊

因此,正如其他人所指出的那樣,您可能必須研究jvm正在使用什么生物,從那里了解使用垃圾回收器(gc調用的頻率)也可能是一個很好的練習,因為這可能會讓您更深入地了解堆棧溢出錯誤,而且可以讓您更深入地了解堆棧溢出錯誤,而且了解Java的一般工作方式。如果真的熱衷于,你可以實現自己的小JVM,并可能有一個更好的方案。


查看完整回答
反對 回復 2022-08-03
  • 4 回答
  • 0 關注
  • 154 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號