为了账号安全,请及时绑定邮箱和手机立即绑定

解决在MacBook上运行Java时在vscode中的性能不佳问题

作为DataSurface的一部分,我开始编写Java Spark任务。我在datasurface仓库中增加了gradle子项目,并在VSCode中安装了默认的Java扩展,支持智能感知、调试和gradle功能。

但这似乎有点慢,可能是我习惯了在VSCode中使用Python的体验,所以可能变得有点挑剔了。一旦我能开始写测试并运行它们,情况马上就变得更糟了。

我在调试测试时发现,启动Spark会话竟然需要超过一分钟的时间,这可真让人沮丧。这机器是M2 MacBook Air(这机器真快)。从1990年开始,我就一直在写Java,那些机器都没这M2 MacBook快。

所以,为什么这么慢呢?我首先想到的是垃圾收集,但JVM分配的内存不足,所以我打开了进程活动监视工具,当它使用了100% CPU时,内存使用还不到1G内存。然后我注意到了一个关键点。进程监视器有一个架构列,显示是Apple还是Intel架构。我的JVM使用的是Intel架构。这意味着它们正在通过Rosetta进行模拟,以使我的M2能够运行Intel架构的应用程序。这样我的M2就可以运行Intel架构的应用程序了。

在早期的苹果芯片阶段,这一点至关重要,但现在几乎所有的部分都已原生支持苹果芯片。我没有安装Intel的JVM,但不知怎么地,vscode似乎自己搞定了这件事。

卸载Intel的JVMs

您可以使用以下命令来查看已安装的JVM:

具体的命令

请根据您的实际环境输入相应的命令。

运行此命令来查看 Java 安装的位置:
$ /usr/libexec/java_home -V

这里列出了JVM。每个JVM都列出来了,并且你可以看到是x86还是arm64架构的JVM。我们需要移除x86架构的JVM。似乎最简单的方法是使用‘rm -rf’命令加上JVM文件路径。例如:

在终端中运行以下命令来删除JDK 17:

$ sudo rm -rf /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home

对于每台机器上安装的每个x86 JVM,都要这样做。将它们替换为苹果的原生JVM。我目前安装的JVM如下:

    $ /usr/libexec/java_home -V  

    找到的 Java 虚拟机 (4):  
        17.0.11 版本 (arm64) "Oracle Corporation" - "Java SE(标准版)17.0.11" /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home  
        11.0.23 版本 (arm64) "Eclipse Adoptium" - "OpenJDK(开源版)11.0.23" /Library/Java/JavaVirtualMachines/temurin-11.jdk/Contents/Home  
        11.0.23 版本 (arm64) "Azul 系统公司" - "Zulu 11.72.19" /Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home  
        1.8.0_412 版本 (arm64) "Azul 系统公司" - "Zulu 8.78.0.19" /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home  

最后一行看起来表明默认的JVM是这样的,对我来说。

    $ java --version  
    java 17.0.11 2024-04-16 LTS  
    Java SE 运行环境 (版本 17.0.11+7-LTS-207)  
    Java HotSpot 64位服务器 VM (版本 17.0.11+7-LTS-207, 混合模式,可共享)

目前,我没有x86的JVM了。在我的系统上也没有剩余的了。

设置默认的 vscode Java 语言服务器的 JVM 环境

接下来,确保 vscode 使用你想要的 JVM 作为语言服务器端,并设置它所需的 JVM 内存大小。

        "java.jdt.ls.vmargs": "-Xmx4G",  
        "java.jdt.ls.java.home": "Library/Java/JavaVirtualMachines/temurin-11.jdk/Contents/Home"  

我在使用JDK 11,并设置了4GB的堆空间。这意味着可以使用4GB的堆内存。语言服务器处理VS Code中的所有Java操作。

为项目指定JDK

我在创建一个Spark作业,由于Spark使用的一些类库在最新的JDK版本中不再支持,所以我需要使用JDK 1.8来运行我的Spark作业。这与上述提到的语言服务器无关。我在build.gradle文件中这样指定。

设置 Java 源代码和目标兼容性为 1.8:

源代码兼容性 = 1.8  
目标兼容性 = 1.8  

然后我还将项目的JDK设置为1.8,在vscode的设置中。你可以先按下Cmd-Shift-P打开设置,然后输入相关设置即可。

Java: 配置 Java 运行环境

这将打开一个面板,显示工作区中可用的Java项目,并允许你验证或更改项目的Java版本。对我来说,它显示的是1.8版本。此面板还允许你通过VSCode下载JDK,只需确保下载的是arm64版本的。从这里下载比自己去找要方便得多,因为较旧版本的支持情况各不相同。

如果你下载了它,请再用上面的步骤确认它是arm64而不是那个Intel的。

摘要

这大大提高了运行测试的效率,从超过一分钟缩短到几秒钟,变化非常大。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
全栈工程师
手记
粉丝
229
获赞与收藏
1002

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消