web-dev-qa-db-ja.com

Java 7および8のメソッドの最大サイズ

Javaでは、メソッドが64KBを超えることはできないことを知っています。この制限により、 JavaCC 文法から生成されたコードで問題が発生します。 Java 6に問題があり、文法を変更することでこれを修正できました。 Java 7の制限は変更されましたか、またはJava 8の制限は予定されていますか?

明確にするためだけに。自分で64 KBを超えるメソッドは必要ありません。しかし、私は非常に大きなメソッドにコンパイルする文法を書きました。

76
LaurentG

JVMS7 によると:

End_pcが排他的であるという事実は、Java仮想マシンの設計における歴史的な誤りです。メソッドのJava仮想マシンコードが正確に65535バイトの場合コンパイラーライターは、生成されたJava virtualの最大サイズを制限することにより、このバグを回避できます。任意のメソッド、インスタンス初期化メソッド、または静的初期化子(コード配列のサイズ)のマシンコードは65534バイトです。

しかし、これはJava 7。 Java 8の最終仕様はないため、開発者以外の誰もこの質問に答えることはできません。

UPD(2015-04-06)JVM8 によれば、Java 8

56
Andremoniy

良い質問。いつものように、答えを見つけるために ソース に移動する必要があります( "TheJava®Virtual Machine Specification" )。ただし、Java6 VM仕様)のように、このセクションでは明示的に制限について言及していませんが、多少慎重になっています。

メソッドの呼び出し時に作成されたフレームのローカル変数配列内のローカル変数の最大数(§2.6)は、コード属性(§4.7.3)のmax_localsアイテムのサイズにより65535に制限され、メソッド、およびJava Virtual Machine命令セットの16ビットローカル変数インデックス付けによる。

乾杯、

10

変更されていません。メソッドのコードの制限は、Java 7およびJava 8。

参照:

  1. Java 7 Virtual Machine Specification( 4.9.1 Static Constraints )から:

Javaクラスファイルの仮想マシンコードの静的制約は、Java仮想マシンの命令をコード配列に配置する必要があり、どのオペランドが個別の指示が必要です。

コード配列内の命令の静的制約は次のとおりです。

  • コード配列は空にしないでください。そのため、code_lengthアイテムの値を0にすることはできません。
  • Code_lengthアイテムの値は65536未満でなければなりません。
  1. Java 8 Virtual Machine Specification( 4.7.3 The Code Attribute ):

Code_lengthアイテムの値は、このメソッドのコード配列のバイト数を示します。

Code_lengthの値は、ゼロより大きく(コード配列が空であってはならないため)、65536未満でなければなりません。

7
Philipp Claßen

AndremoniyはJava 7すでにこの質問の一部ですが、その時点でJava 8だから、その部分をカバーするために答えを完成させます。

jvms からの引用:

End_pcが排他的であるという事実は、Java仮想マシン:メソッドのJava仮想マシンコードが正確に65535バイトの場合コンパイラーの作成者は、生成されるJava Virtualの最大サイズを制限することにより、このバグを回避できます。任意のメソッド、インスタンス初期化メソッド、または静的初期化子(任意のコード配列のサイズ)のマシンコードは65534バイトです。

ご覧のように、この歴史的な問題は少なくともこのバージョン(Java 8)では改善されていないようです。

1
mok