簡體   English   中英

Java 方法中的最大局部變量數

[英]Maximum number of local variables in a Java Method

我理解單一職責原則的重要性,但從技術上講,我們是否對每個 java 方法中的局部變量(存儲在堆棧幀中的變量)的數量有任何上限。 並且上限是否等於最大堆棧大小,即,我可以擁有一個大小等於配置的最大堆棧大小的堆棧幀嗎?

定義局部變量的數量沒有上限。 如果您定義了太多無法放入堆棧幀的變量(或)JVM 無法為該大小分配堆棧幀,它將拋出StackOverflowError並退出。

斯坦福大學教授的精彩 演講可能會對您有所幫助。

我對這個明確問題缺乏直接答案感到驚訝,所以這里是: JVM has a max frame size of 65535 locals and max stack size of 65535, with long and double consuming 2 slots per entry 來自 JVM 規范4.11。 Java 虛擬機的局限性

  • 在調用方法(§2.6)時創建的框架的局部變量數組中的最大局部變量數被 Code 屬性(§4.7.3)的 max_locals 項的大小限制為 65535,給出了方法的代碼方法,並通過 Java 虛擬機指令集的 16 位局部變量索引。

    請注意,long 和 double 類型的值均被視為保留兩個局部變量並為 max_locals 值貢獻兩個單位,因此使用這些類型的局部變量會進一步減少此限制。

  • 幀中操作數堆棧的大小(第 2.6 節)被 Code 屬性(第 4.7.3 節)的 max_stack 字段限制為 65535 個值。

    請注意,long 和 double 類型的值都被認為對 max_stack 值貢獻了兩個單位,因此在操作數堆棧上使用這些類型的值會進一步減少此限制。

Java 語言在理論上可以通過卸載局部變量和堆棧到堆(因為它可以更大)來解決這個 JVM 限制,但在實踐中它並不是真的 - javac (至少從 Java 15 開始)只會出錯如果您有 65535 個局部變量或深度為 65535 的堆棧。

這實際上由您的運行時以及每個進程分配了多少堆棧空間來定義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM