通過遞迴呼叫來測試虛擬機器棧的深度

2021-09-25 01:36:49 字數 973 閱讀 3562

我們知道在jvm記憶體模型中有個虛擬機器棧的存在,它存在的目的是儲存方法以及區域性變數。

棧其原理是:它本身是乙個棧的結構,那麼棧的結構特點是,壓棧和彈棧,當呼叫乙個方法時,就建立乙個該方法的棧幀,將其壓入到虛擬機器棧中,當該方法執行結束時,就將該棧幀彈出虛擬機器棧。

按照這種原理,如果給定乙個虛擬機器的棧的深度,即棧的快取容量,並且入棧和彈棧的效率假設是一樣的話,那麼就不存在神馬stackoverflowexception異常了,那麼到底是不是這樣呢?我們用乙個斐波那契數列測試一下:

package org.chenjianwen.test;

public class fibonacci

if(n == 0)

if(n == 1)

return fibonacci(n-1) + fibonacci(n-2);

}public static void main(string args)

}

當遞迴呼叫比較少的時候,例如10~20之間是可以執行的,但到50以上時,執行就卡殼了,當1000000時就會報出如下棧溢位異常。

由此可見,實際結果並不是像我們所想的那樣,入棧和彈棧效率是一樣的,那結果肯定是入棧的效率遠遠大於出棧的效率,導致棧幀的在虛擬機器棧中的積壓,從而導致棧幀數超出虛擬機器的深度。

那麼,有什麼解決方法呢?兩種,第一減少遞迴呼叫的次數,第二,如果不想減少遞迴呼叫次數,可以用迴圈代替,如下:

public static int circulationinvoke(int n) 

if (n == 2)

if(n > 2)

}return arr;

}public static void main(string args)

}

end。。。

虛擬機器棧相關的問題

q 舉例棧溢位的情況?stackoverflowerror a 遞迴呼叫等,通過 xss設定棧的大小 q 調整棧的大小,就能保證不出現溢位麼?q 分配的棧記憶體越大越好麼?q 垃圾 是否會涉及到虛擬機器棧?a 不會 記憶體區塊 error gc 程式計數器無無 本地方法棧有無 虛擬機器棧有無 堆區有...

通過 PowerShell 的方式增加虛擬機器終結點

關於虛擬機器終結點的概念請閱讀 如何設定虛擬機器的終結點 本文包含以下內容 本文在名稱為 pstest 的虛擬機器做測試 使用 powershell 前有關 azure powershell 的安裝 配置和連線到訂閱請閱讀這篇文章 檢視當前虛擬機器終結點 相關指令 get azurevm get a...

通過 PowerShell 的方式增加虛擬機器終結點

關於虛擬機器終結點的概念請閱讀 如何設定虛擬機器的終結點 本文包含以下內容 本文在名稱為 pstest 的虛擬機器做測試 使用 powershell 前有關 azure powershell 的安裝 配置和連線到訂閱請閱讀這篇文章 檢視當前虛擬機器終結點 相關指令 get azurevm get a...