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 内存管理内存时一个基础又高深的话题,从 ...
随机推荐
- SpringBoot—整合log4j2入门和log4j2.xml配置详解
关注微信公众号:CodingTechWork,一起学习进步. 引言 对于一个线上程序或者服务而言,重要的是要有日志输出,这样才能方便运维.而日志的输出需要有一定的规划,如日志命名.日志大小,日志分 ...
- 提高SSH服务安全,ssh黑白名单
1.调整sshd服务配置,并重载服务 # vim /etc/ssh/sshd_config PermitRootLogin no #禁止root用户登录 Use ...
- 从头看看Tomcat启动Spring容器的原理
通过带注解Spring Boot可以启动一个web容器,并初始化bean容器.那么Tomcat启动并初始化spring容器的原理是怎样的? Tomcat启动web程序时会创建一对父子容器(图1): 有 ...
- 关于“枚举{0,1,...,n-1}所包含的所有大小为k的子集”的理解
前言 今天整理以前的竞赛笔记时,发现了当时写的一个模板: 枚举{0,1,-,n-1}所包含的所有大小为k的子集: int comb = (1 << k) - 1; while (comb ...
- loadrunner做http接口的性能测试
不用录制脚本的方法 步骤: 1.先打开Virtual User Generator——选择Web/HTTP协议,进入到主页面,这里不按照传统录脚本的方式输入url,所以直接叉掉录制脚本选项,进入下面的 ...
- json模块:json.dumps()、json.loads()、json.dump()、json.load()
json.dumps().json.loads().json.dump().json.load() 4个方法的总结和使用: 注意:存在文件里面的东西,读出来都是字符串 import json 1.js ...
- [LeetCode]1071. 字符串的最大公因子(gcd)
题目 对于字符串 S 和 T,只有在 S = T + ... + T(T 与自身连接 1 次或多次)时,我们才认定 "T 能除尽 S". 返回最长字符串 X,要求满足 X 能除尽 ...
- php Zookeeper使用踩坑
用的是Zookeeper扩展,Php版本为7.2.17,下载地址: https://pecl.php.net/package/zookeeper 用的是0.6.4版本 创建节点官方给的示例如下: &l ...
- (转)CrudRepository JpaRepository PagingAndSortingRepository之间的区别
1. 简介 本文介绍三种不同的Spring Data repository和它们的功能,包含以下三种: CrudRepository PagingAndSortingRepository JpaRep ...
- 轻轻松松学CSS:overflow
一.overflow的定义 overflow,音[əʊvəˈfləʊ],义[溢出],就像2.2米的人躺在1.8米的床上,腿得耷拉到床外一样.overflow 属性用于控制内容溢出容器时显示的方式 二. ...