2013-10-01 37 views
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個整數組成的數組列表()方法。這個問題的解決方案並不複雜,我提出了3個方法,每個方法都有3300個整數,並從我的init()中調用它們。

但我有一些純粹出於好奇的問題。

  1. 爲什麼方法對空間有限制?
  2. 爲什麼限制爲65535字節? (2^something-1?)
  3. 有什麼方法可以給方法更多的空間,或者他們都會限制相同的數量嗎?
  4. 準確的數據是65535字節?
+0

的可能重複的[Java中的方法的最大大小?](http://stackoverflow.com/questions/6570343/maximum-size-of-a-method-in-java )和/或[Java 7和8中方法的最大大小](http://stackoverflow.com/questions/17422480/maximum-size-of-a-method-in-java-7-and-8) –

+0

65535 = 2^16 - 1,所以,兩個字節。 – nhgrif

+0

65535是'2^16-1'。 – Doorknob

回答

2

Java Virtual Machine Specification section 4.11:Java虛擬機

的每非本地的,非抽象方法的代碼的量的

限制被限制爲 65536字節由LineNumberTable屬性(§4.7.8), 和Loca中的 代碼屬性(§4.7.3)的exception_table中索引的大小lVariableTable屬性(§4.7.9)。

+0

Nit挑選:雖然這說明了爲什麼編譯器被限制爲64k,但它並沒有真正解釋爲什麼做出決定,其中,恕我直言,這可能是OP所要求的... – MadProgrammer

+0

@MadProgrammer: - 是得到了你的觀點。說實話,我不知道爲什麼做出這個決定。我發現了一個非常有趣的線程,提到相同的: - http://www.velocityreviews.com/forums/t146001-reached-the-65535-bytes-limit.html –

+0

我會想到它會下降到可用的選擇當語言被定義的時候,但我仍然不知道:P – MadProgrammer

-1

你做一些事情錯了,因爲你應該沒有問題,創建一個數組會高於10,000的整數。

@Test 
public void testInts() { 


    ArrayList<Integer> ints = new ArrayList<Integer>(65536); 

    for (int i = 0; i < 65536; i++) { 
     ints.add(new Integer(i)); 
    } 

    System.out.println(ints.size()); 
} 
+0

我有10K加入行的數組列表。 – java

+0

順便說一句我打賭,這個限制是由於建立jvm時的邏輯編譯時參數。它需要對os的堆棧大小的最大值設置一些限制。 –