微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么这超过Java构造函数和静态初始化程序中的65,535字节限制?

免责声明:我意识到我可以在 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]

原文地址:https://www.jb51.cc/java/125170.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐