【编者按】本文作者在和同事的一次讨论中发现,对 IntelliJ IDEA 内存采用不同的设置方案,会对 IDE 的速度和响应能力产生不同的影响。
Don’t be a Scrooge and give your IDE some more memory
不要做守财奴,给IDE多留点内存吧。
昨天,大家就是否自定义 IntelliJ IDEA 的内存设置进行了讨论,有些人选择默认设置,有些人会对默认的设置进行简单的变更,还有一些开发者会基于他们的需求进行全面复杂的设置。笔者目前的工作是处理几个微服务项目和一个老项目,而客户的核心业务需求非常大。对 IntelliJ IDEA 内存进行简单设置以后,笔者明显感受到了该 IDE 在速度和响应方面的改善。但当时笔者并未进行具体的测量,所以这只是主观感受而已。
不过,参与讨论的一位开发者给笔者发了一份他的设置,虽然是针对同个项目,该设置却极其复杂。笔者对自己的设置并无不满,但非常好奇,这些完全不同的设置对比 JetBrains 提供的默认设置,会有怎样的不同。
目标
笔者的计划是,在一个接近日常开发项目的场景下(加载一个大项目、加载2、3个微服务、git pull 后刷新大项目),测试各个设置带来的效果,并选出内存消耗和速度都达到最优时的最佳设置。
测试机器和项目
- 笔记本电脑:MacBook Pro Retina, 2.3GHz Intel Core i7, 16GB 1600Mhz DDR3,SSD Disc, OS X Yosemite
项目
-
大项目—— Monolith ,70万行代码( Java 8 和 Groovy ),303个Gradle模块
-
两个微服务——约有10000——20000行代码( Java 8 和 Groovy )的小项目,各有一个Gradle模块
测试场景
- 在 Idea 中关闭所有项目
- 基于测试文件 idea.vmoptions 进行设置
- 重启电脑
- 启动后关闭所有不相关的项目( communicators 等等)
- 打开 Idea(测试时间)
- 打开大项目(测试时间)
- 检查 jstat -gcutil
- 打开两个微服务项目(测试时间)
- 检查 jstat -gcutil
- 返回大项目然后点击“刷新 Gradle 项目”按钮(测试时间)
- 检查 jstat -gcutil
jstat -gcutil
jstat 是 JDK 自带的工具,主要利用 JVM 内建的指令对 Java 应用程序的资源和性能进行实时的命令行监控,还包括对 Heap size 和垃圾回收状况的监控。它有许多选项来收集各种数据(完整的文档),但这里只会用到: -gcutil :
-gcutil - Summary of garbage collection statistics. S0: Survivor space 0 utilization as a percentage of the space's current capacity. S1: Survivor space 1 utilization as a percentage of the space's current capacity. E: Eden space utilization as a percentage of the space's current capacity. O: Old space utilization as a percentage of the space's current capacity. M: Metaspace utilization as a percentage of the space's current capacity. CCS: Compressed class space utilization as a percentage. YGC: Number of young generation GC events. YGCT: Young generation garbage collection time. FGC: Number of full GC events. FGCT: Full garbage collection time. GCT: Total garbage collection time.
这个命令的输出结果如下:
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 89.70 0.00 81.26 74.27 95.68 91.76 40 2.444 14 0.715 3.159
在本文中,最重要的参数是 GC 事件( YGC 和 FGC )次数和收集时间( YGCT 和 FGCT )。
测试设置
笔者设置了四种不同的设置,为了好记,给它们起了不同的名字。
默认(灰色标识)
JetBrains 提供的默认设置:
-Xms128m -Xmx750m -XX:MaxPermSize=350m -XX:ReservedCodeCacheSize=240m -XX:+UseCompressedOops
Big(大)(红色标识)
给 Xmx 配 4096MB, ReservedCodeCacheSize 设置 1024MB,这已经是相当多的内存了:
-Xms1024m -Xmx4096m -XX:ReservedCodeCacheSize=1024m -XX:+UseCompressedOops
Balanced(平衡的)(蓝色标识)
Xmx 和 Xms 都分配 2GB ,这是相当平衡的内存消耗:
-Xms2g -Xmx2g -XX:ReservedCodeCacheSize=1024m -XX:+UseCompressedOops
Sophisticated(复杂的)(橘色标识)
和上面一样, Xmx 和 Xms 都分配2GB,但是给 GC 和内存管理指定不同的垃圾回收器和许多不同的标志:
-server -Xms2g -Xmx2g -XX:NewRatio=3 -Xss16m -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:ConcGCThreads=4 -XX:ReservedCodeCacheSize=240m -XX:+AlwaysPreTouch -XX:+TieredCompilation -XX:+UseCompressedOops -XX:SoftRefLRUPolicyMSPerMB=50 -Dsun.io.useCanonCaches=false -Djava.net.preferIPv4Stack=true -Djsse.enableSNIExtension=false -ea
以上便是笔者的测试设置,为了执行该测试用例,还需要在~/Library/Preferences/IntelliJIdea15/下创建一个idea.vmoptions文件(这是 Mac OS 系统下的路径设置,查看这篇文章,基于你的操作系统进行设置)
现在,执行测试用例并比较结果。
结果
Idea启动时间
正如上图所示,启动时间并不依赖于内存设置。 Idea 在所有场景下的测试时间都是10秒,无论内存分配有多少。这并不足为奇,因为在此早期阶段,这些设置并不会影响到应用的行为。
加载大项目花费的时间
现在加载 Monolith 项目及其70万行代码。
终于,出现了一些的差异。默认设置所花费的时间几乎是其它的3倍。很明显,如此庞大的代码库需要更多的内存。如果我们执行:
jstat -gcutil <IDEA_PID>
会发现,对比其它设置, GC 在默认设置下会变得异常忙碌。
不仅 GC 释放内存的总时间非常高(几乎达到了50倍),而且 Full GC 的平均执行时间也非常非常长。大量的时间都花在了 Full GC 上面,这是 IDE 响应速度低的主要原因。
在IDEA中打开两个微服务
现在加载这两个微服务项目,在 IDEA 中打开并且对比他们所消耗的时间。
在这个测试用例下,差异还是非常明显的,复杂设置表现最佳,而默认设置仍旧输给了其他两种设置。
再次使用jstat –gcutil
加载完两个微服务项目后,来检查一下同时打开3个项目的情况下, GC 的表现情况。经测试发现,3个不同的自定义设置表现几乎差不多,而默认设置简直弱爆了。
最后的角逐:重新加载Monolith
现在,笔者需要从仓库中获得 Monolith 项目的最新版本,并且刷新 Gradle 模块,这样, IDEA 能看到所有的新类。
重要提示:代表默认设置的灰色条形柱非常高,因为 IDEA 在刷新过程中崩溃了,笔者无法测量实际时间。显然,默认分配的内存不足以执行该操作。
但从三个自定义例子中可以发现,大内存配置花费的时间是最短的。所以,内存分配还是起到了作用。
最后一次使用jstat-gcutil
因为 IDEA 在默认设置下无法刷新项目,所以,这次测试默认设置就不包括在里面。
从上图可以看出,三者之间的差异不大,但是 Big 配置下的 Full GC 执行时间最快。此外, Xmx 内存大些对响应能力提升的帮助非常明显。
总结
在这次简短的实验中,大家可以发现,即使对 IntelliJ IDEA 内存进行微调,都可以大大提升 IDE 性能。当然,内存分配越多,执行效果就越好。但是,你也会发现, IDE 之外许多其他应用程序也需要消耗内存,所以,大家的目标应该是在提高性能和内存消耗之间找到一个平衡。笔者认为,在大多数情况下,把 Xmx 值设置在 2G 和 3G 之间是最佳的。如果你有更多的时间可以用 jstat 和 jvisualm 检查用不同的 JVM 设置如何影响性能和内存占用。
讨论
你的 idea.vmoptions 是如何配置的呢?你还有其它提高 InteliJ IDEA 性能的方法吗?不妨一起讨论讨论吧。
(编译自:https://dzone.com/articles/the-one-and-only-reason-to-customize-intellij-idea)
OneAPM 为您提供端到端的 Java 应用性能解决方案,我们支持所有常见的 Java 框架及应用服务器,助您快速发现系统瓶颈,定位异常根本原因。分钟级部署,即刻体验,Java 监控从来没有如此简单。想阅读更多技术文章,请访问 OneAPM 官方技术博客。
本文转自 OneAPM 官方博客
相关推荐
【IntelliJ IDEA 内存优化最佳实践】 在软件开发过程中,IDE的性能至关重要,特别是对于大型项目而言。IntelliJ IDEA,作为一款强大的Java开发工具,其内存配置的优化可以显著提升开发效率和响应速度。本文将探讨...
内置的静态代码分析器和代码质量检查工具如Inspections和Code Style,能帮助开发者遵循最佳实践,提高代码质量。2019.3版新增了更多检查规则,有助于减少潜在的bug。 6. **性能优化** JetBrains团队持续关注IDE的...
14. **开发最佳实践**:分享使用IntelliJ IDEA的技巧和最佳实践,以提高开发效率和代码质量。 15. **问题排查**:讲解在使用过程中遇到问题时,如何利用官方文档、社区论坛、Stack Overflow等资源来解决。 通过这...
10. **最佳实践**:使用这类工具时,开发者应遵循最佳实践,如只在必要时进行内存搜索,避免对应用程序性能造成过大影响。同时,了解和理解JVM内存管理机制,将有助于更好地利用该工具。 通过理解和掌握这些知识点...
使用 JRebel 的最佳实践** 1. **启用项目支持**:确保在 IntelliJ IDEA 的项目设置中启用 JRebel,这通常在 "Run/Debug Configurations" 中设置。 2. **优化性能**:合理配置 JRebel 的内存设置,避免因资源消耗过...
10. **最佳实践与优化**:分享一些使用IDEA的技巧和最佳实践,如高效导航、自定义快捷键、优化项目配置,提升开发效率。 通过《IDEA基础教程1-15》,读者将能够全面了解并熟练运用IntelliJ IDEA,从而在软件开发...
- `SonarLint`插件能实时检测代码质量,发现潜在的问题,帮助开发者遵循最佳实践。 4. **版本控制集成**: - `GitToolBox`增强了IDEA对Git的集成,提供图形化的分支管理、合并冲突解决等工具。 5. **代码跳转与...
在Java开发环境中,IntelliJ IDEA(简称Idea)是一个非常强大的集成开发工具,而处理JSON数据和与MySQL数据库交互是常见的任务。...记得时刻保持代码整洁,遵循最佳实践,确保代码的可读性和可维护性。
#### 四、高级特性与最佳实践 - **SSM框架搭建**: - 使用Maven创建SSM(Spring + SpringMVC + MyBatis)项目。 - 添加必要的JAR包和依赖。 - 配置Spring框架的支持。 - 整合数据库和MyBatis。 - 配置相关的XML...
在解压后的文件名 "idea_settings-master" 中,"master" 通常用于 Git 仓库的主分支,这可能意味着这是一个公开的 GitHub 项目,包含了关于 IntelliJ IDEA 配置的最佳实践或者模板。 下面我们将深入探讨 IntelliJ ...
这份指南在 2024 年的最新版本中继续强化了对 Java 语言特性和最佳实践的指导。 1. **命名规范**:阿里巴巴 Java 编码指南强调了清晰、一致的命名规则。类名应全大写,使用驼峰式命名(如 MyClass)。方法名和变量...
IntelliJ IDEA允许用户在“Help > Edit Custom VM Options”中调整JVM参数,以优化IDE的性能或内存使用。 14. **项目结构**: 用户可以在“Project Structure”中配置模块、库、SDK等项目元素,以满足项目的特定...
- JProbe可以与Eclipse、IntelliJ IDEA等主流IDE集成,方便开发人员在编写代码的同时进行性能测试和内存检查。 5. **其他特性**: - **动态代理**:JProbe可以创建动态代理,用于在运行时添加监控点,无须修改源...
4. **配置建议**:作者提供的最佳实践和优化建议,以提高开发和运行效率。 【五、执行 MySQL 脚本】 在 IDEA 中使用 SQL 插件或外部工具执行 MySQL 脚本,初始化数据库结构和数据。 【六、启动后台项目】 1. **...
同时,Zeroturnaround(JRebel的开发商)通常会维护一个活跃的社区,提供技术支持和最佳实践分享。 综上所述,JRebel 7.0.14是一个针对IntelliJ IDEA的Java热部署插件,该版本强调性能提升、兼容性更新、用户体验...
在IT行业中,尤其是在开发使用Adobe Flex的项目时,有效地管理内存是至关重要的。...通过理解垃圾收集、事件处理、显示列表管理以及利用各种工具和最佳实践,开发者可以创建更稳定、更高效的Flex应用。
《Scala编码规范》文档则帮助开发者遵循最佳实践编写Scala代码,提升代码的可读性和可维护性。 《Spark开发环境配置及流程(Intellij_IDEA)》指导如何在IntelliJ IDEA中配置Spark项目,包括创建Scala项目、导入Spark...
10. **最佳实践**:书中会总结一系列在J2EE开发中的最佳实践,帮助开发者避免常见错误,提高代码质量和可维护性。 通过阅读《轻量级J2EE企业应用实践》,读者不仅可以掌握J2EE技术的基础,还能了解到如何在实际项目...
【标题解析】 "基于Android的安卓巴士总结了近百个...通过学习这些开源项目,开发者不仅可以掌握Android开发的最新技术和最佳实践,还能了解如何在实际项目中运用这些知识,提升个人技能,为职业发展打下坚实基础。