为什么这超过Java构造函数和静态初始化程序中的65,535字节限制?
发布时间:2020-12-14 16:30:24 所属栏目:Java 来源:网络整理
导读:免责声明:我意识到我可以在 Java的运行时生成这个,在性能测试一些代码时,需要一个非常特殊的情况.我发现了一种不同的方法,所以现在这只是一个比任何实际的好奇心. 我已经尝试过将以下内容作为一个静态字段,作为一个实例字段,并直接在构造函数中初始化.每次e
免责声明:我意识到我可以在
Java的运行时生成这个,在性能测试一些代码时,需要一个非常特殊的情况.我发现了一种不同的方法,所以现在这只是一个比任何实际的好奇心.
我已经尝试过将以下内容作为一个静态字段,作为一个实例字段,并直接在构造函数中初始化.每次eclipse通知我“构造函数TestData()的代码超过65535字节限制”或“静态初始化程序的代码超过65535字节限制”. 有10000个整数.如果每个int是4个字节(32bits),那么那不会是40,000个字节?除了仅仅构建阵列的数据之外,还有更多的这个25,0000字节的开销吗? 这个数据是用这个小的python生成的: #!/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 "};"; 这是一个小样本: 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 解决方法
以下是使用{1000001,1000002,1000003}初始化数组的字节码:
5 iconst_3 6 newarray int [10] 8 dup 9 iconst_0 10 ldc <Integer 1000001> [12] 12 iastore 13 dup 14 iconst_1 15 ldc <Integer 1000002> [13] 17 iastore 18 dup 19 iconst_2 20 ldc <Integer 1000003> [14] 22 iastore 23 putfield net.jstuber.test.TestArrayInitializingConstructor.data : int[] [15] 所以对于这个小数组,每个元素需要5个字节的Java字节码.对于更大的数组,数组索引和常量池中的索引将为大多数元素使用3个字节,这导致每个数组元素8个字节.因此,对于10000个元素,您不得不期望约80kB的字节码. 用16位索引初始化大数组的代码如下所示: 2016 dup 2017 sipush 298 2020 ldc_w <Integer 100298> [310] 2023 iastore 2024 dup 2025 sipush 299 2028 ldc_w <Integer 100299> [311] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |