热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

IntelliJIDEA卡死,如何优化内存

本文作者在和同事的一次讨论中发现,对intellijidea内存采用不同的设置方案,会对ide的速度和响应能力产生不同的影响。don'tbeascroogeandgive

本文作者在和同事的一次讨论中发现,对 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 和垃圾回收状况的监控。

jstat 完整的文档:


https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html


它有许多选项来收集各种数据,但这里只会用到:-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 系统下的路径设置,基于你的操作系统进行设置,关注公众号:java面试那些事儿,回复关键字idea,获取最新的idea教程)

现在,执行测试用例并比较结果。

结果

idea启动时间

正如上图所示,启动时间并不依赖于内存设置。idea 在所有场景下的测试时间都是10秒,无论内存分配有多少。这并不足为奇,因为在此早期阶段,这些设置并不会影响到应用的行为。更多idea内容:intellij idea 2020.1 已正式发布

加载大项目花费的时间

现在加载 monolith 项目及其70万行代码。终于,出现了一些的差异。默认设置所花费的时间几乎是其它的3倍。很明显,如此庞大的代码库需要更多的内存。如果我们执行:


jstat -gcutil

会发现,对比其它设置, 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 性能的方法吗?不妨一起讨论讨论吧。


译者:oneapm

译文:blog.oneapm.com/apm-tech/426.html

原文:dzone.com/articles/the-one-and-only-reason-to-customize-intellij-idea


到此这篇关于intellij idea卡死,如何优化内存的文章就介绍到这了,更多相关intellij idea 优化内存内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!



推荐阅读
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • IT方面的论坛太多了,有综合,有专业,有行业,在各个论坛里混了几年,体会颇深,以前是论坛哪里人多 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • Linux下安装免费杀毒软件ClamAV及使用方法
    本文介绍了在Linux系统下安装免费杀毒软件ClamAV的方法,并提供了使用该软件更新病毒库和进行病毒扫描的指令参数。同时还提供了官方安装文档和下载地址。 ... [详细]
  • 开发笔记:Python之路第一篇:初识Python
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python之路第一篇:初识Python相关的知识,希望对你有一定的参考价值。Python简介& ... [详细]
  • 导读:在编程的世界里,语言纷繁多样,而大部分真正广泛流行的语言并不是那些学术界的产物,而是在通过自由发挥设计出来的。和那些 ... [详细]
  • Answer:Theterm“backslash”isonofthemostincorrectlyusedtermsincomputing.People ... [详细]
  • 生产环境下JVM调优参数的设置实例
     正文前先来一波福利推荐: 福利一:百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。福利二 ... [详细]
  • 关于extjs开发实战pdf的信息
    本文目录一览:1、extjs实用开发指南2、本 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
author-avatar
一夜知秋50050
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有