先上结论:
- 如果是更改idea的自定义vm选项后报错,如图
可以直接在C:\Users\xxx\AppData\Roaming\JetBrains\IdeaIC2023.1
路径下找到idea64.exe.vmoptions文件(或者idea.exe.vmoptions) ,删除后重新打开即可。
如果不想删除,则可以打开文件看看有没有不合理的地方,比如
ReservedCodeCacheSize是否过大,修改后即可。
- 改善编译速度在文章最后
问题复现
报错截图
走的弯路
今天在使用IDEA写代码时,发现同学编译速度明显比我快,一个简单的小项目,同学1-2秒完工,我居然需要5-6s,那绝对不能忍。
我的配置是R7 5800H加上普普通通SSD,应该不至于那么差,所以在互联网世界小搜了一下。
在一篇题为“IntelliJ build is extremely slow compared to external Maven build”的文章中,我发现了一种很新颖的解决方法,如图
评论说比之前快多了,那我这刚学的英语哪能受这委屈 ,直接当场cv到IDEA的vm设置里,之后IDEA就再也打不开了。
代码如下:
-Dcompiler.ref.index=false
下面是对这行的解释
简单来说,JVM会在启动时对类和方法进行扫描,生成引用索引。
引用索引即JVM在运行时为了提高类加载和方法查找的性能而创建的数据结构。
这个启动参数用于禁用JVM在运行时生成和维护对类和方法的引用索引。
但是如果不需要频繁加载和查找类和方法,禁用引用索引可能会提高JVM的启动速度和内存使用效率。
当时天真如我没看日期和具体解释就去干活了。
所以到这里问题就结束了吗?并没有。由解释可见,这行命令只是禁用了索引,并不会导致IDEA打不开。
因此只能寻找其他因素,我在查资料时唯一更改的只有vm设置,因此也只能是其出现相关问题。
备份原文件后删除c盘下相应文件后果然得到解决。
问题在于VM参数设置
检查原文件相关设置,可以发现这里除了禁用索引,就是对内存的调整。前两个设置最大最小内存,每超出范围不会引发IDEA无法启动的问题,因此只能是第三个参数,即预留代码缓存区大小的设置。
ReservedCodeCacheSize 是JIT编译器存放本地代码的代码缓存区域的大小。换句话说,这就是Java这种传统意义上的解释型语言又被认为有编译型语言的特点的原因。虚拟机将热点代码编译成机器码,编译后的机器码就存储在这里。
显而易见,缓存区的大小将严重影响程序性能的稳定性。因此,在网络常见的虚拟机内存设置中都会建议将其调大一点。那么问题来了,该缓存区可以无限大吗?明显不能!
我在编辑相关设置时,曾将其设置为4096m,会不会是因为过大导致崩溃?
经过查找相关资料,windows系统为其限定到了2G大小,超过限制则会导致IDEA无法启动,问题解决。
其他
最后总结一下优化性能的方法
- 对我帮助最大的就是把Javac编译器更改为Eclipse了,基本能把编译速度降低3秒左右,目前没有任何bug出现,以后不一定
- 其次网上给出一些更改内存的方法,目前对我没有任何作用,这里还是贴出来吧
在File | Settings | Build, Execution, Deployment | Compiler 中,将Shared build process heap size (Mbytes)根据你的内存大小进行调整。
另外,在Help | Change Memory Settings中,同样根据内存大小进行调整,最高可达你可用内存的85%1 - 可以在vm参数里设置ReservedCodeCacheSize的大小,最高2G,建议根据自己的环境配置。另外JDK8以前的版本可以手动开启分层编译,其余版本可以设置TierCompileThreshold参数调整jvm虚拟机对热点代码的判断机制,不过官方不建议更改