2017-04-22 5 views
1

最近JVM内部について読んでいて、その要素の1つ、つまりメソッドのオペランドスタックに関する質問がありました。それは最大のサイズを持っていますし、私たちはそれをオーバーフローさせることができますか?手動で行うことはできますか、それともどのような状態が発生する可能性がありますか?Javaメソッドのオペランドスタック

+0

最大サイズは、JVMに割り当てられたメモリから、すでに使用されているメモリを差し引いたもので表されます。 –

答えて

1

最大サイズは、メソッドごとにMaxStack属性で設定されます。より大きなオペランドスタック(または不定サイズのオペランドスタック)を作成すると、検証エラーが発生するため、実際には動的にオーバーフローさせることはできません。正しい(制限内に留まる)か、ロードさえしません。

MaxStack属性のタイプはuint16のであるので、あなたは
-1スロットにオペランドスタックのサイズアップを指定することができます。ワイド型は、ローカル変数と同じように2スロットを使用します。だから実際には大きなJavaの式は理論的には解消できませんが、実際にはjavacはその前にずっとスタックスペース(実​​際のスタックスペース、オペランドスタックではなく)が不足しています。

属性が正しく設定されていないと、MaxStack属性で設定した制限を超えてしまうことがあります。これは、ClassWriterを十分注意しなくても発生することがあります。