JVM 第六篇:极致优化 IDEA 启动速度

本文内容过于硬核,建议有 Java 相关经验人士阅读。
1. 引言
相信做 Java 开发的同学,对 IDEA 这个工具应该都不陌生,即使不使用 IDEA 做开发,那么对 Eclipse 这个工具应该也不会陌生,如果这两个都不用的同学,我就想弱弱问一句,您不会是在使用记事本吧?

上面除了那个记事本,我相信所有的同学都对 IDEA 或者说 Eclipse 这两个工具的打开速度深有印象吧。
只要你没自己改过启动参数,不管电脑多高的配置,我相信这个打开速度应该都快不到哪去。
前面写了这么多篇的 JVM 相关内容,今天我尝试优化一下 IDEA 的启动速度(手头没有 Eclipse ),这算是小试牛刀,希望最后不要翻车。

2. 开始
我使用的是 JDK 自带的 VisualVM 可视化工具,主要使用的是它的那个 GC 插件。

首先第一次打开 IDEA ,加载时长按照 IDEA 所有组件加载完成进行人工卡点(本来想找个插件的,结果 IDEA 这方面的插件还真没找到)。
IDEA 在打开的过程中,右下角会有一个进度条在一直读条,我就大约等那个条读完了进行计时。
后续操作的过程中发现其实完全没必要,因为差距简直太明显了。
首先在默认配置的情况下第一次打开 IDEA ,然后看下 VisualVM 的数据图:
GC 情况:

概览情况:

我直接被这个 Class Loader 加载速度惊呆了,活活消耗了 3m 34s 的时间,由于其他操作都是并行的,这一项的耗时直接撑破天了。
不过同时可以看到 GC 的消耗,好像并不是很大, Minor GC 发生了 147 次,但是 Full GC 一次都没有发生过,共计耗时 712ms 。
但是看到下面的概览图还是能发现一些端倪的,就比如当前堆大小在一直不停的扩容。
先找到 IDEA 的配置文件,看下默认配置,我本地的路径是 D:\Program Files\JetBrains\apps\IDEA-U\ch-0 ,这个路径每个人都不一样,大家自己找自己的,找到以后打开 idea64.exe.vmoptions 这个文件:
-Xms128m
-Xmx750m
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-XX:CICompilerCount=2
-Dsun.io.useCanonPrefixCache=false
-Djdk.http.auth.tunneling.disabledSchemes=""
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-Djdk.attach.allowAttachSelf=true
-Dkotlinx.coroutines.debug=off
-Djdk.module.illegalAccess.silent=true
可以看到最小堆是设置 128MB ,而最大堆是 750MB ,使用的是 CMS 收集器,我使用的电脑硬件内存是 16GB ,这么大的内存空间,果断直接把最小堆改成 1G ,最大堆改成 2G ,关掉 IDEA 再重启看下效果。
修改后的配置如下:
-Xms1g
-Xmx2g
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
GC 情况:

概览情况:

可以看到,Class Loader 时长瞬间就下来了,从 3m 变成了 24s ,并且 Minor GC 的时长整整缩短了一半,从 712ms 下降到了 342ms ,次数也由之前的 147 次下降到了现在的 9 次,依然没有 Full GC 产生(废话,内存开了这么大又填不满)。
并且看概览图的时候可以看到,堆内存扩容只扩容了一次。
那么还能不能再短点呢?看下整个图,感觉 ClassLoader 还有空间嘛,我们还可以把加载时的验证给关掉,使用 -Xverify:none ,这样应该还能再降低一些加载的耗时。
修改后的配置如下:
-Xms1g
-Xmx2g
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-Xverify:none
GC 情况:

概览情况:

果然,加载时长从之前的 24s 继续下降到了 19s ,差不多减少了有 1/4 左右,还是卓有成效的。
接着我想如果直接把最小堆也设置成 2G ,那么堆大小就无需扩容,会不会有更加正向的影响?
修改后的配置如下:
-Xms2g
-Xmx2g
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-Xverify:none
GC 情况:

概览情况:

实际上并没有什么太大成效。
从概览中可以看到,我当前版本的 IDEA 使用的是自带的 JDK11 :

JDK11 中是有 G1 收集器的,我要么开启 G1 试一下:
-Xms1g
-Xmx2g
-XX:ReservedCodeCacheSize=240m
-XX:+UseG1GC
-XX:SoftRefLRUPolicyMSPerMB=50
-Xverify:none
GC 情况:

概览情况:

看起来好像 Minor GC 的耗时还略有上涨,并且 GC 的次数从 9 次变成了 19 次。
不过看到概览图发现了一个更神奇的事情,当使用 G1 的时候,整个使用堆大小竟然没有突破 1G ,看来电脑内存不够大的同学更加推荐使用 G1 回收器,虽然 GC 的耗时稍有增加,不过能减少内存的使用,而 G1 的 GC 机制又是大量并行的,这点根本无伤大雅。
最后我放一下我修改后的整体的配置:
-Xms1g
-Xmx2g
-XX:ReservedCodeCacheSize=240m
-XX:+UseG1GC
-XX:SoftRefLRUPolicyMSPerMB=50
-Xverify:none
-ea
-XX:CICompilerCount=2
-Dsun.io.useCanonPrefixCache=false
-Djdk.http.auth.tunneling.disabledSchemes=""
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-Dkotlinx.coroutines.debug=off
-Djdk.module.illegalAccess.silent=true
-Dide.no.platform.update=true
-Djdk.attach.allowAttachSelf=true
-Didea.plugins.path=D:\\Program Files\\JetBrains\\apps\\IDEA-U\\ch-0\\202.7660.26.plugins
当然,如果不用 IDEA 的同学,只要是用 Jetbrain 全家桶套件,例如写 Python 最常用的 Pycharm ,同样也可以按照本文的方式进行配置,我自己又给 Pycharm 修改了一下配置,启动速度绝对大幅提升,肉眼可见的那种。
JVM 第六篇:极致优化 IDEA 启动速度的更多相关文章
- PLC状态机编程第六篇-优化PLC程序生成
还记得第一篇博客中,我们在状态机中手写上升沿来处理有别于传统的一键启停程序,那个手写的上升沿就是优化手段.stateflow状态机是带事件的,事件本身支持上升沿和下降沿等事件,在这里,如果我们选择用事 ...
- 【JVM第六篇--对象】对象的实例化、内存布局和访问定位
写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.对象的实例化 在平常写代码的过程中,我们用class关键字定义的类只是一个类的模 ...
- 【面试 JVM】【第六篇】JVM调优
六部分内容: 一.内存模型 1.程序计数器,方法区,堆,栈,本地方法栈的作用,保存那些数据 可以画个大图出来,很清晰 jvm内存模型主要指运行时的数据区,包括5个部分. 栈也叫方法栈,是线程私有的,线 ...
- Mysql优化(出自官方文档) - 第六篇
Mysql优化(出自官方文档) - 第六篇 目录 Mysql优化(出自官方文档) - 第六篇 Optimizing Subqueries, Derived Tables, View Reference ...
- Java读取Level-1行情dbf文件极致优化(3)
最近架构一个项目,实现行情的接入和分发,需要达到极致的低时延特性,这对于证券系统是非常重要的.接入的行情源是可以配置,既可以是Level-1,也可以是Level-2或其他第三方的源.虽然Level-1 ...
- Java读取Level-1行情dbf文件极致优化(1)
最近架构一个项目,实现行情的接入和分发,需要达到极致的低时延特性,这对于证券系统是非常重要的.接入的行情源是可以配置,既可以是Level-1,也可以是Level-2或其他第三方的源.虽然Level-1 ...
- 【Python之旅】第六篇(七):开发简易主机批量管理工具
[Python之旅]第六篇(七):开发简易主机批量管理工具 python 软件开发 Paramiko模块 批量主机管理 摘要: 通过前面对Paramiko模块的学习与使用,以及Python中多线程与多 ...
- Android性能优化之启动速度优化
Android性能优化之启动速度优化 Android app 启动速度优化,首先谈谈为什么会走到优化这一步,如果一开始创建 app 项目的时候就把这个启动速度考虑进去,那么肯定就不需要重新再来优化 ...
- App架构师实践指南六之性能优化三
App架构师实践指南六之性能优化三 2018年08月02日 13:57:57 nicolelili1 阅读数:190 内存性能优化1.内存机制和原理 1.1 内存管理内存时一个基础又高深的话题,从 ...
随机推荐
- hyperledger explorer 结合 fabric1.4 搭建 区块链浏览器 踩坑记录
博主通过这篇博客的步骤搭建区块链浏览器:https://blog.csdn.net/qq_32675427/article/details/99946945 进行到下面这一步时出现各种异常,浪费了博主 ...
- C#开发PACS医学影像处理系统(一):开发背景和说明
本系列文章将从以下模块和大家分享和讨论使用C#开发医学软件PACS和RIS系统, 国内相关资料比较少,也借此机会丰富一下医学软件开发生态,讨论技术难点,希望大家互相帮助共同进步. 章节介绍及截图预览: ...
- python之Lambda
Python 匿名函数lambda lambda表达式在“:”后只能有一个表达式.也就是说,在def中,用return可以返回的也可以放在lambda后面,不能用return返回的也不能定义在py ...
- 吴恩达《深度学习》-第二门课 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)-第一周:深度学习的实践层面 (Practical aspects of Deep Learning) -课程笔记
第一周:深度学习的实践层面 (Practical aspects of Deep Learning) 1.1 训练,验证,测试集(Train / Dev / Test sets) 创建新应用的过程中, ...
- 3.ConcurrentMap-并发Map
- WPF 从 .net core 3.1到 .net 5.0
WPF 从 .net core 3.1 到 .net 5.0 Intro 昨天更新了一个简单的 asp.net core webapi 项目,从 3.1 更新到了 5.0,今天更新一个 WPF 应用到 ...
- Registry 容器镜像服务端细节
引言 通常我们在使用集群或者容器的时候,都会接触到存储在本地的镜像,也或多或少对本地镜像存储有一定的了解.但是服务端的镜像存储细节呢?本文主要介绍容器镜像的服务端存储结构,对于自建镜像服务或是对容器镜 ...
- php第一天-分支结构,循环结构,特殊的流程控制语句
1.单向条件分支结构 <?php if(true) { echo "yes"; } ?> 2.双向条件分支结构 <?php $a = 10; if($a < ...
- Spring Cloud各组件学习
Spring-Cloud 介绍 SpringCloud各个组件详解,因为SpringCloud部分组件停止更新,故本项目包含原SpringCloud(基于SpringCloud H版和SpringBo ...
- C# NX二次开发环境搭建
在网上看到一篇C#二次开发环境搭建的文章:NX二次开发-使用NXOPEN C#手工搭建开发环境配置 ,写得非常好.我按照文章操作,过程中遇到几个问题,把问题分享给大家,希望对各位有帮助. 注意三点: ...