intellijidea内存优化最佳实践

晨曦歡迎您! 晨曦歡迎您!     2022-08-18     750

关键词:

【编者按】本文作者在和同事的一次讨论中发现,对 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模块

测试场景

  1. 在 Idea 中关闭所有项目
  2. 基于测试文件 idea.vmoptions 进行设置
  3. 重启电脑
  4. 启动后关闭所有不相关的项目( communicators 等等)
  5. 打开 Idea(测试时间)
  6. 打开大项目(测试时间)
  7. 检查 jstat -gcutil
  8. 打开两个微服务项目(测试时间)
  9. 检查 jstat -gcutil
  10. 返回大项目然后点击“刷新 Gradle 项目”按钮(测试时间)
  11. 检查 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

 

http://blog.csdn.net/github_32521685/article/details/50541436

intellijidea内存优化最佳实践

【编者按】本文作者在和同事的一次讨论中发现,对IntelliJIDEA内存采用不同的设置方案,会对IDE的速度和响应能力产生不同的影响。Don’tbeaScroogeandgiveyourIDEsomemorememory不要做守财奴,给IDE多留点内存吧。昨天,大家就是否自定义... 查看详情

c#性能优化最佳实践

1、显式注册的EvenHandler要显式注销以避免内存泄漏将一个成员方法注册到某个对象的事件会造成后者持有前者的引用。在事件注销之前,前者不会被垃圾回收。privatevoidForm1_Load(){……//注册事件CommandRemotingContext.CmdChanged+=newReciverC... 查看详情

在 React 应用中映射数组以优化性能的最佳实践

...制作一个返回搜索结果的简单字典应用程序。使用字典的内存数据库lokiJS对搜索字段的每个onChange进行查询,因此结果非常很快。优化结果的呈现对我来说很重要,这样大约50个过 查看详情

hbase最佳实践-cmsgc调优(从gc本身参数调优)

...存Memstore进行优化开始,到0.96版本提出BucketCache以及堆外内存方案对读缓存BlockCache进行优化,再到后续2.0版本宣称会引入更多堆外内存,可 查看详情

Laravel 工匠优化最佳实践

】Laravel工匠优化最佳实践【英文标题】:LaravelartisanoptimizeBestPractices【发布时间】:2015-10-3123:14:23【问题描述】:我正在尝试完全理解Laravel(5.1)artisanoptimize命令和最佳实践,但似乎缺少文档。我没有在生产服务器上安装Composer,... 查看详情

jQuery 优化/最佳实践

】jQuery优化/最佳实践【英文标题】:jQueryOptimization/BestPractices【发布时间】:2011-03-1422:18:36【问题描述】:好的,给牛仔装上鞍,因为这将是一个很长的时间。我整个上午都在浏览我的一些旧代码,我想知道最佳实践和优化。为... 查看详情

一触即发——app启动优化最佳实践

一触即发App启动优化最佳实践文中的很多图都是Google性能优化指南第六季中的一些截图Google给出的优化指南来镇楼https://developer.android.com/topic/performance/launch-time.html闪屏定义Android官方的性能优化典范,从第六季开始,发起了一系... 查看详情

C# 实体框架 - 优化/最佳实践

】C#实体框架-优化/最佳实践【英文标题】:C#EntityFramework-Optimization/BestPractices【发布时间】:2021-04-3013:34:19【问题描述】:我有一个具有以下结构的实体框架数据库:“Lots”是零件的命名集合“部件”是单独的部件“站”是零... 查看详情

一触即发app启动优化最佳实践

一触即发App启动优化最佳实践本文在 DiyCode 和 CSDN个人博客 同时首发,关注作者的 DiyCode帐号 或者 作者微博 可第一时间收到新文章推送。文中的很多图都是Google性能优化指南第六季中的一些截图Goo... 查看详情

优化 LAMP 网站以提高速度的最佳实践? [关闭]

】优化LAMP网站以提高速度的最佳实践?[关闭]【英文标题】:BestpracticesforoptimizingLAMPsitesforspeed?[closed]【发布时间】:2010-10-1609:59:58【问题描述】:我想知道在LAMP堆栈上构建典型网站时,如何优化它以实现最佳加载时间。我正在... 查看详情

转web程序优化的最佳实践:javascript和css篇

Yahoo!的ExceptionalPerformance团队为改善Web性能带来最佳实践。他们为此进行了一系列的实验、开发了各种工具、写了大量的文章和博客并在各种会议上参与探讨。最佳实践的核心就是旨在提高网站性能。ExcetionalPerformance团队总结出... 查看详情

C++ 性能/内存优化指南

】C++性能/内存优化指南【英文标题】:C++Performance/memoryoptimizationguidelines【发布时间】:2010-03-3118:19:26【问题描述】:有人有C++内存优化指南的资源吗?最佳实践、调优等?举个例子:Classxxxpublic:xxx();virtual~xxx();protected:private:;由... 查看详情

慢sql治理最佳实践(代码片段)

慢SQL治理主要从三个方面进行优化从数据表的定义开始优化从索引设计开始优化从查询开始优化优化表设计表字段长度尽量紧凑,字段尽量不冗余字段类型尽量考虑用简单的类型字段尽量有默认值,且默认值尽量不要用null优化... 查看详情

java导出excel最佳实践,大文件excel避免oom(内存溢出)框架-02-api

项目简介IExcel用于优雅地读取和写入excel。避免大excel出现oom,简约而不简单。。特性OO的方式操作excel,编程更加方便优雅。sax模式读取,SXSS模式写入。避免excel大文件OOM。基于注解,编程更加灵活。写入可以基于对象列表,也... 查看详情

8个云成本优化的最佳实践

...:用于完成特定任务或处理用户请求的所需算力的百分比内存使用:公有云、私有云及混合云环境中内存的使用情况每分钟的请求数量:基于云的应用每分钟收到的用户请求的数量磁盘使用率:跟踪某个节点上使用的磁盘容量,... 查看详情

在objective-c中为原始类型分配内存的最佳实践

】在objective-c中为原始类型分配内存的最佳实践【英文标题】:Bestpracticetoallocatememoryforprimitivetypesinobjective-c【发布时间】:2011-11-1412:56:03【问题描述】:在Objective-c中为原始类型分配内存的最佳做法是什么?使用C分配是好的(mal... 查看详情

redis内存优化在vivo的探索与实践

介绍Redis内存结构及内存管理方式,同时分享一些内存优化建议及内存异常处理相关的优化措施。介绍Redis内存结构及内存管理方式,同时分享一些内存优化建议及内存异常处理相关的优化措施。分享vivo互联网技术干货与沙龙活... 查看详情

jQuery 插件模板 - 最佳实践、约定、性能和内存影响

】jQuery插件模板-最佳实践、约定、性能和内存影响【英文标题】:jQueryplugintemplate-bestpractice,convention,performanceandmemoryimpact【发布时间】:2011-08-2405:23:17【问题描述】:我已经开始编写一些jQuery插件,并认为使用jQuery插件模板设置... 查看详情