IntelliJ IDEA、GoLand内存优化

您所在的位置:网站首页 idealinux版吃内存 IntelliJ IDEA、GoLand内存优化

IntelliJ IDEA、GoLand内存优化

2024-01-15 00:15| 来源: 网络整理| 查看: 265

目录

 

IDE偶发性崩溃

祭出ZGC

 注意

IDE偶发性崩溃

自从工作开发语言从Java切换到golang,每天就跟goland打交道,goland说白了就是idea套个壳子,都基于一个内核,基于Java开发的。为了便于理解,这里用idea指代goland。

Find Usages是我最常用的功能之一,选择某个函数或者声明查看被使用的地方。Find Usages底层就是基于抽象语法树解析源码,解析sdk,解析第三方包,涉及大量文件读取、字符串解析,堆内存压力很大。尤其是同时打开多个项目、多个窗口。偶尔idea界面卡死,甚至崩溃退出。

 idea jvm配置如下:

-Xms2048m -Xmx4096m -XX:+UseG1GC

堆内存已经配置很大了,还是偶发性崩溃。

我用的idea 2021.1.3已经是当前最新版本,默认的boot Java runtime(idea大部分基于Java开发,执行环境是Java Runtime)是jre 11,打开两个idea窗口,找个SDK里面最常用的类通过Find Usages尝试重现,通过jconsole查看JVM老年代有一个飙升的过程,新生代不断的垃圾收集。Find Usages的过程就是不断构建抽象语法树,不断丢弃无效对象(大部分是string)的过程,所以新生代垃圾收集比较频繁,累计耗时15秒。其中一部分垃圾最终进入老年代,老年代达到一定容量会发生异常Full GC,耗时0.469秒。

不管是新生代、老年代只要GC都会stop-the-world。

 在垃圾收集过程,如果CPU繁忙或者其他原因,Young GC、Full GC不及时,也确实会造成卡顿、OOM、崩溃退出。由于我是做后端开发的,习惯打开N多窗口,N个应用,大部分情况下瓶颈不在CPU,而是内存不够了。

祭出ZGC

没有不够的堆内存,只有没调好的JVM参数,遇到这种事情JVM调优肯定是首选,但世界那么大,我想出去看看,生产用不了最先进的ZGC,但开发个Golang总能可以吧。

这里对ZGC不再过多赘述,只需要知道大部分场景下ZGC GC一次不超过10ms。

查阅ZGC官方文档:Main - Main - OpenJDK Wiki (java.net)

MAC跟Windows上最低JDK要求为14 ,经过测试idea 2021.1.3已经能够通过JDK 16启动。

JDK这里选择知名JVM提供商 Azul基于OpenJDK编译好的zulu发行版:Java Download | Java 8, Java 11, Java 13 - Linux, Windows & macOS (azul.com)

Azul出品必属精品,ZGC所采用的算法就是Azul Systems很多年前提出的Pauseless GC。

更改idea的Java runtime前一定要先备份配置文件,以免启动不了idea。

按idea官方文档Change the boot Java runtime of the IDE | IntelliJ IDEA (jetbrains.com) ,到这个目录:Advanced configuration | IntelliJ IDEA (jetbrains.com),去备份idea vmoptions或者 goland vmoptions。

若更改后idea启动不了删除idea.jdk或者goland.jdk,不同系统可能名字不一样,但大同小异。

打开Help -> Find Action->Choose Boot Java Runtime for the IDE

更改为JDK 16,打开Help->Edit Custom VM options,再次强调到这个目录:Advanced configuration | IntelliJ IDEA (jetbrains.com),去备份idea vmoptions或者 goland vmoptions。

以Windows系统为例,goland对应配置叫goland64.exe.vmoptions

基于JDK 16开启ZGC,别忘了加上--illegal-access参数,否则无法启动

-Xms2048m -Xmx4096m -XX:+UnlockExperimentalVMOptions -XX:+UseZGC --illegal-access=permit --add-exports:java.base/jdk.internal.ref=ALL-UNNAMED --add-exports=java.desktop/sun.awt.image=ALL-UNNAMED

然后再次Find Usages,开启jconsole监控,发现堆内存涨的快,下降的也快,垃圾回收累计耗时 0.07秒,注意是累计不是单次。

开启三个窗口Find Usages过程界面一度卡的亲妈都不认识,但也没崩溃退出。

界面卡顿更多跟Java图形编程的单线程模型有关,这个不在于JVM。

 

 注意

ZGC的开足马力GC时候CPU占用,堆内存飙升速度都比G1垃圾收集器高一些,不一定适合性能弱的电脑。但我的个人电脑是i7 CPU +16G内存,工作电脑是i7 CPU+32G内存,用ZGC也算是相得益彰。

在Mac 上的“活动监视器”中查看内存使用率,会发现idea(GoLand)最大内存是堆内存的三倍,这个是ZGC特性造成的,不是真的占用了那么多物理内存,也算是个Mac系统bug。详情见这里:

 使用zgc导致linux平台下top命令显示内存占用超过100%_kakaweb的博客-程序员宅基地 - 程序员宅基地 (cxyzjd.com)

jvm - The Java ZGC garbage collector USES a lot of memory - Stack Overflow



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3