我正在开发一个针对旧项目中的问题的快速解决方案。
问题在于,在处理该方法之前,需要将输入中的某些字符串转换为不同的字符串。
这些字符串很小,只有 10 到 30 个字符,“转换”也很小
没有必要过于复杂,解决方案这是一个一次性项目,我简单地创建了一个
Map<String,String>
来将输入转换为所需的输出
要包含在地图中的字符串列表是 1300 个,因为这应该是一个快速修复,所以我不想读取文件并进行更复杂的过程...我简单地将内联粘贴到代码中
private static final Map<String, String> translation = Map.ofEntries(
Map.Entry("a","b"),
Map.Entry("c","b"),
Map.Entry("d","b"),
Map.Entry("e","f"),
Map.Entry("g","gg"),
...
1300 行 [查找/替换花了 1 分钟] 全班变成了1400行64k字符
但即使从语法角度来看,一切都还好。项目停止编译
intellij 会冻结在“写作课程......”
我的电脑是 i7、12 核、32GB,会像鸡蛋一样开始沸腾
20分钟后编译还没有完成...
我很快用谷歌搜索了这个问题,看到人们在不同情况下报告了类似的问题
https://youtrack.jetbrains.com/issue/IDEA-162091/Writing-classes-when-compiling-is-suddenly-very-very-slow
IntelliJ IDEA:第一次编译需要很多时间
我尝试了他们的修复但没有成功,我什至将 intellij 更新到最新版本,但什么也没有
删除了巨大的内联地图创建,一切工作正常,使地图读取外部文件,整个项目按预期工作......但我变得非常好奇
为什么 JVM 会因为内联数组过大而无法编译代码? 我想澄清这不是运行时问题,而是编译时问题
64k 个字符在编译期间不应该是堆的巨大内存,所以我一直认为 jvm 中内联数组创建存在硬限制
有没有人更清楚此类问题的原因是什么
问题是intellij不是开源的。向他们提交支持票。 Javac 对此没有问题,直到您达到 64k 的...某些东西(很难直接翻译;例如,类文件限制是每个方法 64k 操作码,而您构建的内容或多或少是一个“方法”(它是一个实例初始化程序,具有相同的 64k 操作码限制)。但是
.put
链有多少个操作码?要点是,当您达到此限制时,javac 会迅速 告诉。在任何情况下,javac 都不会启动你的系统并飞出窗外。
为什么 JVM 会因为内联数组太大而无法编译代码?
您可以通过实际使用
javac
而不是 intellij 来确认这一点。