本文内容过于硬核,建议有 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 启动速度的更多相关文章

  1. PLC状态机编程第六篇-优化PLC程序生成

    还记得第一篇博客中,我们在状态机中手写上升沿来处理有别于传统的一键启停程序,那个手写的上升沿就是优化手段.stateflow状态机是带事件的,事件本身支持上升沿和下降沿等事件,在这里,如果我们选择用事 ...

  2. 【JVM第六篇--对象】对象的实例化、内存布局和访问定位

    写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.对象的实例化 在平常写代码的过程中,我们用class关键字定义的类只是一个类的模 ...

  3. 【面试 JVM】【第六篇】JVM调优

    六部分内容: 一.内存模型 1.程序计数器,方法区,堆,栈,本地方法栈的作用,保存那些数据 可以画个大图出来,很清晰 jvm内存模型主要指运行时的数据区,包括5个部分. 栈也叫方法栈,是线程私有的,线 ...

  4. Mysql优化(出自官方文档) - 第六篇

    Mysql优化(出自官方文档) - 第六篇 目录 Mysql优化(出自官方文档) - 第六篇 Optimizing Subqueries, Derived Tables, View Reference ...

  5. Java读取Level-1行情dbf文件极致优化(3)

    最近架构一个项目,实现行情的接入和分发,需要达到极致的低时延特性,这对于证券系统是非常重要的.接入的行情源是可以配置,既可以是Level-1,也可以是Level-2或其他第三方的源.虽然Level-1 ...

  6. Java读取Level-1行情dbf文件极致优化(1)

    最近架构一个项目,实现行情的接入和分发,需要达到极致的低时延特性,这对于证券系统是非常重要的.接入的行情源是可以配置,既可以是Level-1,也可以是Level-2或其他第三方的源.虽然Level-1 ...

  7. 【Python之旅】第六篇(七):开发简易主机批量管理工具

    [Python之旅]第六篇(七):开发简易主机批量管理工具 python 软件开发 Paramiko模块 批量主机管理 摘要: 通过前面对Paramiko模块的学习与使用,以及Python中多线程与多 ...

  8. Android性能优化之启动速度优化

    Android性能优化之启动速度优化   Android app 启动速度优化,首先谈谈为什么会走到优化这一步,如果一开始创建 app 项目的时候就把这个启动速度考虑进去,那么肯定就不需要重新再来优化 ...

  9. App架构师实践指南六之性能优化三

    App架构师实践指南六之性能优化三 2018年08月02日 13:57:57 nicolelili1 阅读数:190   内存性能优化1.内存机制和原理 1.1 内存管理内存时一个基础又高深的话题,从 ...

随机推荐

  1. [Java数据结构]Map的contiansKey和List的contains比较

    Map的containskey方法使用哈希算法查找key是否存在,运算时间是常数: List的contains方法是将元素在列表中遍历,运算时间和列表长度有关. 我使用两种不同SQL语句获取两种不同类 ...

  2. leetcode刷题-80.删除排序数组中的重复项 II

    题目 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. ...

  3. 理解Spring AOP的实现方式与思想

    Spring AOP简介 如果说IOC是Spring的核心,那么面向切面编程就是Spring最核心的功能之一了,在数据库事务中,面向切面编程被广泛应用. AOP能够将那些与业务无关,却为业务模块所共同 ...

  4. spring cloud微服务快速教程之(十二) 分布式ID解决方案(mybatis-plus篇)

    0-前言 分布式系统中,分布式ID是个必须解决的问题点: 雪花算法是个好方式,不过不能直接使用,因为如果直接使用的话,需要配置每个实例workerId和datacenterId,在微服务中,实例一般动 ...

  5. FTP服务器稳定性测试

    FTP服务器稳定性探讨,如何部署FTP服务在server2003上,可能广大网友们有其他的选择,我选择的是Filezilla server.毕竟他是开源又免费 在架构师的悉心指导下,对FTP有了个更深 ...

  6. 从 LRU Cache 带你看面试的本质

    前言 大家好,这里是<齐姐聊算法>系列之 LRU 问题. 在讲这道题之前,我想先聊聊「技术面试究竟是在考什么」这个问题. 技术面试究竟在考什么 在人人都知道刷题的今天,面试官也都知道大家会 ...

  7. xxe漏洞,及xml

    xxe漏洞 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.XML文档结构包括XML声明.DTD文档类型定义(可选).文 ...

  8. spark 笔记2

    一.Spark Shuffle 的发展 Spark 0.8及以前 Hash Based Shuffle Spark 0.8.1 为Hash Based Shuffle引入File Consolidat ...

  9. synchronized 锁的升级

    synchronized 的基本认识 在多线程并发编程中 synchronized 一直是元老级角色,很 多人都会称呼它为重量级锁.但是,随着 Java SE 1.6 对 synchronized 进 ...

  10. linux 基础语法

    1.linux常用命令 1.1 系统命令 runlevel                     # 查看当前的运行级别systemctl status sshd        # 开启网络服务功能 ...