Haftungsausschluss: Ich weiß, dass ich dies zur Laufzeit in Java generieren kann, das war für einen ganz speziellen Fall während der Leistungsprüfung einige Code erforderlich. Ich habe eine andere Herangehensweise gefunden, also ist dies eher eine Kuriosität als irgendetwas Praktisches.Warum überschreitet das Limit von 65.535 Byte in Java-Konstruktoren und statischen Initialisierern?
Ich habe Folgendes als statisches Feld versucht, als Instanz Feld und direkt im Konstruktor initialisiert. Jedes Mal, wenn Eclipse mich darüber informiert, dass entweder der Code des Konstruktors TestData() den Grenzwert von 65535 Bytes überschreitet oder der Code für den statischen Initialisierer den Grenzwert von 65535 Bytes überschreitet.
Es gibt 10.000 ganze Zahlen. Wenn jedes int 4 Byte (32 Bit) ist, wären das nicht 40.000 Byte? Gibt es wirklich mehr als 25.000 Bytes Overhead zusätzlich zu den Daten, die nur das Array aufbauen?
Die Daten werden mit diesem kleinen Stück Python generiert:
#!/usr/bin/python
import random;
print "public final int[] RANDOM_INTEGERS = new int[] {";
for i in range(1,10000):
print str(int(random.uniform(0,0x7fffffff))) + ",";
print "};";
Hier ist eine kleine Auswahl:
public final int[] RANDOM_INTEGERS = new int[] {
963056418, 460816633, 1426956928, 1836901854, 334443802, 721185237, 488810483,
1734703787, 1858674527, 112552804, 1467830977, 1533524842, 1140643114, 1452361499,
716999590, 652029167, 1448309605, 1111915190, 1032718128, 1194366355, 112834025,
419247979, 944166634, 205228045, 1920916263, 1102820742, 1504720637, 757008315,
67604636, 1686232265, 597601176, 1090143513, 205960256, 1611222388, 1997832237,
1429883982, 1693885243, 1987916675, 159802771, 1092244159, 1224816153, 1675311441,
1873372604, 1787757434, 1347615328, 1868311855, 1401477617, 508641277, 1352501377,
1442984254, 1468392589, 1059757519, 1898445041, 1368044543, 513517087, 99625132,
1291863875, 654253390, 169170318, 2117466849, 1711924068, 564675178, 208741732,
1095240821, 1993892374, 87422510, 1651783681, 1536657700, 1039420228, 674134447,
1083424612, 2137469237, 1294104182, 964677542, 1506442822, 1521039575, 64073383,
929517073, 206993014, 466196357, 1139633501, 1692533218, 1934476545, 2066226407,
550646675, 624977767, 1494512072, 1230119126, 1956454185, 1321128794, 2099617717,
//.... to 10,0000 instances
Beim Nachschlagen finde ich, dass diese Grenze für alle Methoden (einschließlich Konstruktoren) sowie statische Initialisierer gilt. Interessant! –
http://groups.google.com/group/comp.lang.java.machine/browse_thread/thread/b0cf268515f1ef55 –