背景:
idea2021.1.1
jdk1.8
因为idea在启动项目的时候耗时很长,5分钟左右,于是百度了下idea占用cpu和内存过高的问题,发现有文章是说要更改idea的Runtime Version,
比如: 彻底解决Idea内存消耗严重和CPU资源占比严重的问题 (baidu.com)
intellij idea cpu占用率太大太满 运行速度太慢 使了五个解决方法最终成功_trusause的博客-CSDN博客_idea占用内存过大
Choose Runtime,从默认的sdk11改成sdk8,idea自动重启的时候失败了,提示:
---------------------------
Error launching IDEA
---------------------------
Could not find main class com/intellij/idea/Main
搜索了下这个错误,国内文章给的解决方案大多是配置jdk的路径,如 IDEA 启动报错could not find main class com/intellij/idea/main解决办法_人生如戏 全靠演技-CSDN博客
在环境变量里配置IDEA_JDK_64等。
思路其实是对的,只是没能找到启动idea时设置使用的jdk路径的地方。
idea提供了命令行启动的方式,在idea的安装路径下bin目录(和idea64.exe同一个路径)有个idea.bat批处理文件,用cmd或PowerShell执行该bat之后,即能看到启动的详细信息,以PowerShell为例:
PS C:\Users\xxx> cd D:\develop\IDEA\bin
PS D:\develop\IDEA\bin> .\idea.bat
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/intellij/idea/Main has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)
PS D:\develop\IDEA\bin>
报错的意思是com.intellij.idea.Main这个class文件版本号是55.0(对应jdk11),而运行用的jre是52.0(对应jdk8)。
对应关系可以参考我的另一篇文章JDK version和class file version(Class编译版本号)对应关系_lzhfdxhxm的博客-CSDN博客
查看下idea.bat批处理,梳理里面的流程,可以发现使用的jre是有优先级判断的。批处理里就有注释:
:: ---------------------------------------------------------------------
:: Locate a JRE installation directory which will be used to run the IDE.
:: Try (in order): IDEA_JDK, idea%BITS%.exe.jdk, ..\jbr[-x86], JDK_HOME, JAVA_HOME.
:: ---------------------------------------------------------------------
IDEA_JDK这个环境变量我的环境变量里没配置;
idea%BITS%.exe.jdk这个不是环境变量,是指定路径的文件。这个文件是刚才在安装sdk8的时候自动生成/修改的,如下图:
idea64.exe.jdk文件的内容:
C:\Users\lzhf\AppData\Roaming\JetBrains\IntelliJIdea2021.1\jdks\jbsdk8u112b287.2_windows_x64
这个路径下就是刚刚安装的jre8
那么问题就简单了,删除idea64.exe.jdk这个文件就好了,这样就会去判断后续的设置(这就相当于Choose Runtime里没有将默认的sdk11改成sdk8)。
如果没有更改过其它设置的话,那么最后使用的jre是idea安装路径下的jre:
D:\develop\IDEA\jbr\bin\java.exe
就这样,idea成功的启动了!
如果有过其它个性化的配置,那么按照idea.bat里的逻辑一层层梳理下来,总能找到自己配置的地方,并加以修复。在过程中,可以打印日志,来辅助判断。
比如在打印出jre最终的值: