Java 类加载需要很长时间才能加载带有大开关盒块的类

Java 类加载需要很长时间才能加载带有大开关盒块的类,java,Java,我对带有大开关块的类进行了Java类加载的快速基准测试。我有10门课,有30-40个开关模块。使用Java8时,它占用了我约3秒的时间(Java7只占用了约1.9秒) 有谁能解释一下在加载带有大开关块的类时,幕后发生了什么,以及为什么它如此缓慢 编辑: 枚举似乎有问题。如果枚举大小较大,则类加载需要时间。下面是一个例子 public abstract class A { public static enum ENUM { A100, A113, A126, A139, A

我对带有大开关块的类进行了Java类加载的快速基准测试。我有10门课,有30-40个开关模块。使用Java8时,它占用了我约3秒的时间(Java7只占用了约1.9秒)

有谁能解释一下在加载带有大开关块的类时,幕后发生了什么,以及为什么它如此缓慢

编辑:

枚举似乎有问题。如果枚举大小较大,则类加载需要时间。下面是一个例子

public abstract class A {
    public static enum ENUM {
        A100, A113, A126, A139, A152, A165, A178, A191, A204, A217, A230, A243, A256, A269, A282, A295,
        A308, A321, A334, A347, A360, A373, A386, A399, A412, A425, A438, A451, A464, A477, A490, A503,
        A516, A529, A542, A555, A568, A581, A594, A607, A620, A633, A646, A659, A672, A685, A698, A711,
        A724, A737, A750, A763, A776, A789, A802, A815, A828, A841, A854, A867, A880, A893, A906, A919,
        A932, A945, A958, A971, A984, A997, A1010, A1023, A1036, A1049, A1062, A1075, A1088, A1101, A1114,
        A1127, A1140, A1153, A1166, A1179, A1192, A1205, A1218, A1231, A1244, A1257, A1270, A1283, A1296,
        A1309, A1322, A1335, A1348, A1361, A1374, A1387, A1400, A1413, A1426, A1439, A1452, A1465, A1478,
        A1491, A1504, A1517, A1530, A1543, A1556, A1569, A1582, A1595, A1608, A1621, A1634, A1647, A1660,
        A1673, A1686, A1699, A1712, A1725, A1738, A1751, A1764, A1777, A1790, A1803, A1816, A1829, A1842,
        A1855, A1868, A1881, A1894, A1907, A1920, A1933, A1946, A1959, A1972, A1985, A1998, A2011, A2024,
        A2037, A2050, A2063, A2076, A2089, A2102, A2115, A2128, A2141, A2154, A2167, A2180, A2193, A2206,
        A2219, A2232, A2245, A2258, A2271, A2284, A2297, A2310, A2323, A2336, A2349, A2362, A2375, A2388, 
        A2401, A2414, A2427, A2440, A2453, A2466, A2479, A2492, A2505, A2518, A2531, A2544, A2557, A2570,
        A2583, A2596, A2609, A2622, A2635, A2648, A2661, A2674, A2687, A2700, A2713, A2726, A2739, A2752,
        A2765, A2778, A2791, A2804, A2817, A2830, A2843, A2856, A2869, A2882, A2895, A2908, A2921, A2934,
        A2947, A2960, A2973, A2986, A2999, A3012, A3025, A3038, A3051, A3064, A3077, A3090, A3103, A3116, 
        A3129, A3142, A3155, A3168, A3181, A3194, A3207, A3220, A3233, A3246, A3259, A3272, A3285, A3298, 
        A3311, A3324, A3337, A3350, A3363, A3376, A3389, A3402, A3415, A3428, A3441, A3454, A3467, A3480,
        A3493, A3506, A3519, A3532, A3545, A3558, A3571, A3584, A3597, A3610, A3623, A3636, A3649, A3662, 
        A3675, A3688, A3701, A3714, A3727, A3740, A3753, A3766, A3779, A3792, A3805, A3818, A3831, A3844, 
        A3857, A3870, A3883, A3896, A3909, A3922, A3935, A3948, A3961, A3974, A3987, A4000, A4013, A4026,
        A4039, A4052, A4065, A4078, A4091, A4104, A4117, A4130, A4143, A4156, A4169, A4182, A4195, A4208, 
        A4221, A4234, A4247, A4260, A4273, A4286, A4299, A4312, A4325, A4338, A4351, A4364, A4377, A4390, 
        A4403, A4416, A4429, A4442, A4455, A4468, A4481, A4494, A4507, A4520, A4533, A4546, A4559, A4572, 
        A4585, A4598, A4611, A4624, A4637, A4650, A4663, A4676, A4689, A4702, A4715, A4728, A4741, A4754, 
        A4767, A4780, A4793, A4806, A4819, A4832, A4845, A4858, A4871, A4884, A4897, A4910, A4923, A4936, 
        A4949, A4962, A4975, A4988, A5001, A5014, A5027, A5040, A5053, A5066, A5079, A5092, A5105, A5118, 
        A5131, A5144, A5157, A5170, A5183, A5196, A5209, A5222, A5235, A5248, A5261, A5274, A5287, A5300, 
        A5313, A5326, A5339, A5352, A5365, A5378, A5391, A5404, A5417, A5430, A5443, A5456, A5469, A5482, 
        A5495, A5508, A5521, A5534, A5547, A5560, A5573, A5586, A5599, A5612, A5625, A5638, A5651, A5664, 
        A5677, A5690, A5703, A5716, A5729, A5742, A5755, A5768, A5781, A5794, A5807, A5820, A5833, A5846, 
        A5859, A5872, A5885, A5898, A5911, A5924, A5937, A5950, A5963, A5976, A5989, A6002, A6015, A6028, 
        A6041, A6054, A6067, A6080, A6093, A6106, A6119, A6132, A6145, A6158, A6171, A6184, A6197, A6210,
        A6223, A6236, A6249, A6262, A6275, A6288, A6301, A6314, A6327, A6340, A6353, A6366, A6379, A6392, 
        A6405, A6418, A6431, A6444, A6457, A6470, A6483, A6496, A6509, A6522, A6535, A6548, A6561, A6574,
        A6587, A6600, A6613, A6626, A6639, A6652, A6665, A6678, A6691, A6704, A6717, A6730, A6743, A6756, 
        A6769, A6782, A6795, A6808, A6821, A6834, A6847, A6860, A6873, A6886, A6899, A6912, A6925, A6938,
        A6951, A6964, A6977, A6990, A7003, A7016, A7029, A7042, A7055, A7068, A7081, A7094, A7107, A7120, 
        A7133, A7146, A7159, A7172, A7185, A7198, A7211, A7224, A7237, A7250, A7263, A7276, A7289, A7302, 
        A7315, A7328, A7341, A7354, A7367, A7380, A7393, A7406, A7419, A7432, A7445, A7458, A7471, A7484,
        A7497, A7510, A7523, A7536, A7549, A7562, A7575, A7588, A7601, A7614, A7627, A7640, A7653, A7666,
        A7679, A7692, A7705, A7718, A7731, A7744, A7757, A7770, A7783, A7796, A7809, A7822, A7835, A7848, 
        A7861, A7874, A7887, A7900, A7913, A7926, A7939, A7952, A7965, A7978, A7991, A8004, A8017, A8030,
        A8043, A8056, A8069, A8082, A8095, A8108, A8121, A8134, A8147, A8160, A8173, A8186, A8199, A8212, A8225,
        A8238, A8251, A8264, A8277, A8290, A8303, A8316, A8329, A8342, A8355, A8368, A8381, A8394, A8407,
        A8420, A8433, A8446, A8459, A8472, A8485, A8498, A8511, A8524, A8537, A8550, A8563, A8576, A8589, 
        A8602, A8615, A8628, A8641, A8654, A8667, A8680, A8693, A8706, A8719, A8732, A8745, A8758, A8771, 
        A8784, A8797, A8810, A8823, A8836, A8849, A8862, A8875, A8888, A8901, A8914, A8927, A8940, A8953, 
        A8966, A8979, A8992, A9005, A9018, A9031, A9044, A9057, A9070, A9083, A9096, A9109, A9122, A9135, 
        A9148, A9161, A9174, A9187, A9200, A9213, A9226, A9239, A9252, A9265, A9278, A9291, A9304, A9317,
        A9330, A9343, A9356, A9369, A9382, A9395, A9408, A9421, A9434, A9447, A9460, A9473, A9486, A9499, 
        A9512, A9525, A9538, A9551, A9564, A9577, A9590, A9603, A9616, A9629, A9642, A9655, A9668, A9681, 
        A9694, A9707, A9720, A9733, A9746, A9759, A9772, A9785, A9798, A9811, A9824, A9837, A9850, A9863,
        A9876, A9889, A9902, A9915, A9928, A9941, A9954, A9967, A9980, A9993, A10006, A10019, A10032, A10045,
        A10058, A10071, A10084, A10097, A10110, A10123, A10136, A10149, A10162, A10175, A10188, A10201, A10214,
        A10227, A10240, A10253, A10266, A10279, A10292, A10305, A10318, A10331, A10344, A10357, A10370, A10383,
        A10396, A10409, A10422, A10435, A10448, A10461, A10474, A10487, A10500, A10513, A10526, A10539, A10552,
        A10565, A10578, A10591, A10604, A10617, A10630, A10643, A10656, A10669, A10682, A10695, A10708, A10721,
        A10734, A10747, A10760, A10773, A10786, A10799, A10812, A10825, A10838, A10851, A10864, A10877, A10890,
        A10903, A10916, A10929, A10942, A10955, A10968, A10981, A10994, A11007, A11020, A11033, A11046, A11059, 
        A11072, A11085, A11098, A11111, A11124, A11137, A11150, A11163, A11176, A11189, A11202, A11215, A11228, 
        A11241, A11254, A11267, A11280, A11293, A11306, A11319, A11332, A11345, A11358, A11371, A11384, A11397, 
        A11410, A11423, A11436, A11449, A11462, A11475, A11488, A11501, A11514, A11527, A11540, A11553, A11566, 
        A11579, A11592, A11605, A11618, A11631, A11644, A11657, A11670, A11683, A11696, A11709, A11722, A11735, 
        A11748, A11761, A11774, A11787, A11800, A11813, A11826, A11839, A11852, A11865, A11878, A11891, A11904, 
        A11917, A11930, A11943, A11956, A11969, A11982, A11995, A12008, A12021, A12034, A12047, A12060, A12073, 
        A12086, A12099, A12112, A12125, A12138, A12151, A12164, A12177, A12190, A12203, A12216, A12229, A12242, 
        A12255, A12268, A12281, A12294, A12307, A12320, A12333, A12346, A12359, A12372, A12385, A12398, A12411, 
        A12424, A12437, A12450, A12463, A12476, A12489, A12502, A12515, A12528, A12541, A12554, A12567, A12580, 
        A12593, A12606, A12619, A12632, A12645, A12658, A12671, A12684, A12697, A12710, A12723, A12736, A12749, 
        A12762, A12775, A12788, A12801, A12814, A12827, A12840, A12853, A12866, A12879, A12892, A12905, A12918, 
        A12931, A12944, A12957, A12970, A12983, A12996, A13009, A13022, A13035, A13048, A13061, A13074, A13087, 
        A13100, A13113, A13126, A13139, A13152, A13165, A13178, A13191, A13204, A13217, A13230, A13243, A13256, 
        A13269, A13282, A13295, A13308, A13321, A13334, A13347, A13360, A13373, A13386, A13399, A13412, A13425, 
        A13438, A13451, A13464, A13477, A13490, A13503, A13516, A13529, A13542, A13555, A13568, A13581, A13594, 
        A13607, A13620, A13633, A13646, A13659, A13672, A13685, A13698, A13711, A13724, A13737, A13750, A13763, 
        A13776, A13789, A13802, A13815, A13828, A13841, A13854, A13867, A13880, A13893, A13906, A13919, A13932, 
        A13945, A13958, A13971, A13984, A13997, A14010, A14023, A14036, A14049, A14062, A14075, A14088, A14101, 
        A14114, A14127, A14140, A14153, A14166, A14179, A14192, A14205, A14218, A14231, A14244, A14257, A14270, 
        A14283, A14296, A14309, A14322, A14335, A14348, A14361, A14374, A14387, A14400, A14413, A14426, A14439, 
        A14452, A14465, A14478, A14491, A14504, A14517, A14530, A14543, A14556, A14569, A14582, A14595, A14608, 
        A14621, A14634, A14647, A14660, A14673, A14686, A14699, A14712, A14725, A14738, A14751, A14764, A14777, 
        A14790, A14803, A14816, A14829, A14842, A14855, A14868, A14881, A14894, A14907, A14920, A14933, A14946, 
        A14959, A14972, A14985, A14998, A15011, A15024, A15037, A15050, A15063, A15076, A15089, A15102, A15115, 
        A15128, A15141, A15154, A15167, A15180, A15193, A15206, A15219, A15232, A15245, A15258, A15271, A15284, 
        A15297, A15310, A15323, A15336, A15349, A15362, A15375, A15388, A15401, A15414, A15427, A15440, A15453, 
        A15466, A15479, A15492, A15505, A15518, A15531, A15544, A15557, A15570, A15583, A15596, A15609, A15622, 
        A15635, A15648, A15661, A15674, A15687, A15700, A15713, A15726, A15739, A15752, A15765, A15778, A15791, 
        A15804, A15817, A15830, A15843, A15856, A15869, A15882, A15895, A15908, A15921, A15934, A15947, A15960, 
        A15973, A15986, A15999, A16012, A16025, A16038, A16051, A16064, A16077, A16090, A16103, A16116, A16129, 
        A16142, A16155, A16168, A16181, A16194, A16207, A16220, A16233, A16246, A16259, A16272, A16285, A16298, 
        A16311, A16324, A16337, A16350, A16363, A16376, A16389, A16402, A16415, A16428, A16441, A16454, A16467, 
        A16480, A16493, A16506, A16519, A16532, A16545, A16558, A16571, A16584, A16597, A16610, A16623, A16636, 
        A16649, A16662, A16675, A16688, A16701, A16714, A16727, A16740, A16753, A16766, A16779, A16792, A16805, 
        A16818, A16831, A16844, A16857, A16870, A16883, A16896, A16909, A16922, A16935, A16948, A16961, A16974, 
        A16987, A17000, A17013, A17026, A17039, A17052, A17065, A17078, A17091, A17104, A17117, A17130, A17143, 
        A17156, A17169, A17182, A17195, A17208, A17221, A17234, A17247, A17260, A17273, A17286, A17299, A17312, 
        A17325, A17338, A17351, A17364, A17377, A17390, A17403, A17416, A17429, A17442, A17455, A17468, A17481, 
        A17494, A17507, A17520, A17533, A17546, A17559, A17572, A17585, A17598, A17611, A17624, A17637, A17650, 
        A17663, A17676, A17689, A17702, A17715, A17728, A17741, A17754, A17767, A17780, A17793, A17806, A17819, 
        A17832, A17845, A17858, A17871, A17884, A17897, A17910, A17923, A17936, A17949, A17962, A17975, A17988, 
        A18001, A18014, A18027, A18040, A18053, A18066, A18079, A18092, A18105, A18118, A18131, A18144, A18157, 
        A18170, A18183, A18196, A18209, A18222, A18235, A18248, A18261, A18274, A18287, A18300, A18313, A18326, 
        A18339, A18352, A18365, A18378, A18391, A18404, A18417, A18430, A18443, A18456, A18469, A18482, A18495, 
        A18508, A18521, A18534, A18547, A18560, A18573, A18586, A18599, A18612, A18625, A18638, A18651, A18664, 
        A18677, A18690, A18703, A18716, A18729, A18742, A18755, A18768, A18781, A18794, A18807, A18820, A18833, 
        A18846, A18859, A18872, A18885, A18898, A18911, A18924, A18937, A18950, A18963, A18976, A18989, A19002, 
        A19015, A19028, A19041, A19054, A19067, A19080, A19093, A19106, A19119, A19132, A19145, A19158, A19171, 
        A19184, A19197, A19210, A19223, A19236, A19249, A19262, A19275, A19288, A19301, A19314, A19327, A19340, 
        A19353, A19366, A19379, A19392, A19405, A19418, A19431, A19444, A19457, A19470, A19483, A19496, A19509, 
        A19522, A19535, A19548, A19561, A19574, A19587,
    }

    public abstract float getValue(int a, ENUM input);
}

public class A1 extends A {
    @Override
    public float getValue(int a, ENUM input) {
        float ret = input.ordinal();

        switch (input) {
        case A100:
            ret = a / 100;
            break;
        }
        return ret;
    }
}

public class A2 extends A {
    @Override
    public float getValue(int a, ENUM input) {
        float ret = input.ordinal();

        switch (input) {
        case A100:
            ret = a / 100;
            break;
        }
        return ret;
    }
}

public class Load {
    public static void main(String[] args) {
        long time = System.currentTimeMillis();
        new A1().getValue(10, ENUM.A10032);
        System.out.println("Time taken - A1:" + (System.currentTimeMillis() - time));

        time = System.currentTimeMillis();
        new A2().getValue(10, ENUM.A10032);
        System.out.println("Time taken - A2:" + (System.currentTimeMillis() - time));
    }
}
输出:

Time taken - A1:242
Time taken - A2:209

如果有人感兴趣,我通过@Joop Eggen&@SpaceTrucker从上面的评论中得到的提示自己解决了这个问题

从A1和A1生成的类文件约为70KB。在这些生成的类文件中,switch语句使用static进行优化,因为枚举是连续整数

此表开关具有所有枚举,而不考虑开关大小写块中使用的枚举数类加载过程中花费的大部分时间用于创建和填充这个大表开关。

有趣的是,为什么Oracles的Java8使用tableswitch加载这样一个类的时间是Java7的两倍


如果有一个选项可以在TableSwitch和LookupSwitch之间进行选择,这也会很有用。

更有趣的数字是.class文件的实际大小以及每个开关中平均有多少case语句。您是否测量过类似大小的类的加载时间?否则,您将测量Java7和Java8之间的加载时间。使用
javap-c
进行反汇编。有一种已知的编译器优化策略,可以在if-then-else和jump表的树中转换开关,以防止跳转表中出现漏洞。也许会发生这样的(代价高昂的)评估。天哪,这是一个巨大的枚举。为什么?你怎么能写一个这么大的switch/case语句而不出错呢?