2

今日、初めて次のエラーメッセージが表示されました...

java.lang.Error: Unresolved compilation problem: 
    The code of method init() is exceeding the 65535 bytes limit

    at generator.Main.init(Main.java:36)
    at sun.applet.AppletPanel.run(AppletPanel.java:425)
    at java.lang.Thread.run(Thread.java:680)

init() メソッドで約 10,000 の int を持つ配列リストを作成しているため、エラーが発生しています。この問題の解決策はそれほど複雑ではありません。それぞれ 3,300 個の int を持つ 3 つのメソッドを作成し、init() からすべて呼び出しました。

しかし、純粋に好奇心からいくつか質問があります。

  1. メソッドのスペースに制限があるのはなぜですか?
  2. 65535 バイトに制限されているのはなぜですか? (2^何か-1?)
  3. メソッドにより多くのスペースを与える方法はありますか、それともすべて同じ量に制限されますか?
  4. 65535 バイトは正確にどのくらいの情報量ですか?
4

2 に答える 2

2

Java 仮想マシン仕様のセクション 4.11から:

Java 仮想マシンの制限

非ネイティブで非抽象メソッドごとのコード量は、Code 属性の exception_table (§4.7.3)、LineNumberTable 属性 (§4.7.8) のインデックスのサイズによって 65536 バイトに制限されます。 LocalVariableTable 属性 (§4.7.9) で。

于 2013-10-01T21:55:54.663 に答える
-1

答えは、JVM 仕様の「クラス ファイル形式」ページにあります。JVM はこのように動作する必要があります。そうしないと、JVM ではありません。

http://docs.oracle.com/javase/specs/jvms/se5.0/html/ClassFile.doc.html

于 2013-10-01T21:59:36.887 に答える