Eclipse和IntelliJ是业界两个竞争的IDE。 社交媒体和论坛上进行了许多热烈的讨论,宣布了这场比赛的胜利者。 我们认为研究哪种IDE有效地利用内存是一个有趣的练习。
研究
为了进行这项研究,我们使用了Eclipse Java EE氧气发行里程碑2(4.7.0 M2)和IntelliJ IDEA 2018.2.4(最终版)。 两个IDE都在Java 8上运行。
为了有效地进行这项研究,我们希望激活IDE的各种功能。 因此,我们最终创建了一个简单的Java项目。 在这个项目中,我们创建了一个JSP页面,Manager类,DAO类,它将从MySQL数据库写入和读取记录。 我们正在编写源代码,对其进行编译,运行单元测试以验证行为。 这些活动花了我们1小时45分钟。 我们在Eclipse和IntelliJ IDE中进行了完全相同的练习。
如何学习记忆效率?
研究应用程序的内存行为的最佳方法之一是分析垃圾回收活动。 垃圾回收活动将在必杀技中清楚地显示内存利用率模式,对象创建率,对象回收率,垃圾回收暂停时间和其他与内存相关的详细信息。
如何研究垃圾收集活动?
可以通过启用垃圾收集日志并使用正确的工具来分析垃圾收集日志来研究垃圾收集活动。 可以通过传递以下JVM参数来启用垃圾收集日志:
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:{GC-log-file-path}
在本练习中,我们使用GCeasy工具分析垃圾收集日志。
在安装Eclipse的文件夹中,有eclipse.ini文件。 其内容如下所示:
-startup plugins/org.eclipse.equinox.launcher_1. 3.200 .v20160914- 0716 .jar --launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1. 1.400 .v20160914- 0716 -product org.eclipse.epp. package .jee.product --launcher.defaultAction openFile -showsplash org.eclipse.platform --launcher.defaultAction openFile --launcher.appendVmargs -vmargs -Dosgi.requiredJavaVersion= 1.8 -XX:+UseG1GC -XX:+UseStringDeduplication -Dosgi.requiredJavaVersion= 1.8 -Xms256m -Xmx1024m
在该文件的底部,我们添加了以下参数以启用Eclipse IDE的垃圾收集日志。
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:D:\my_workspace\logs\eclipse-gc.log
在安装IntelliJ的文件夹中,您会注意到idea64.exe.vmoptions文件。 其内容如下所示:
-Xms256m -Xmx1024m -XX:ReservedCodeCacheSize=240m -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB= 50 -ea -Dsun.io.useCanonCaches= false -Djava.net.preferIPv4Stack= true -Djdk.http.auth.tunneling.disabledSchemes= "" -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow
在此文件的底部,我们添加了以下参数以启用IntelliJ IDE的垃圾收集日志。
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:D:\my_workspace\logs\intellij-gc.log
注意:默认情况下,IntelliJ的初始堆大小保持为128mb,最大堆大小设置为750mb。 Eclipse的初始堆大小设置为256mb,最大堆大小设置为1024mb。 因此,为了进行比较,我们将IntelliJ的初始堆大小提高到256mb,将最大堆大小提高到1024mb。
记忆行为比较
完成1小时45分钟的练习后,我们将两个IDE生成的垃圾收集日志文件上传到GCeasy工具。 以下是该工具生成的详细分析报告。 我们鼓励您查看该报告:
以下是GC分析报告中的主要观察结果:
对象创建率
与IntelliJ相比,显然Eclipse创建了很少的对象。 Eclipse IDE创建对象的速度为2.41 MB /秒 ,而IntelliJ创建对象的速度为69.65 MB /秒 (比Eclipse高29倍)。 对于整个运行,Eclipse仅创建了15.19 GB ,其中IntelliJ创建了430.2 GB的对象。 由于创建了更多对象,因此在使用IntelliJ IDE时,CPU消耗也更高。
GC暂停时间
在垃圾回收的某些阶段,整个应用程序将暂停。 显然,Eclipse的平均GC暂停时间为33 ms ,最大GC暂停时间为340 ms 。 另一方面,IntelliJ的平均GC暂停时间仅为8 ms ,最大GC暂停时间为270 ms 。 因此,就GC暂停而言,IntelliJ相对更好。 尽管IntelliJ的对象创建率较高,但是由于IntelliJ中进行了更好的GC调整,其平均停顿时间比Eclipse要好。
GC吞吐量
GC吞吐量基本上是您的应用程序在处理客户交易中所花费的时间与您的应用程序在垃圾收集中所花费的时间。 在我们的研究中,Eclipse的吞吐量为99.924%,而IntelliJ的吞吐量为99.146% 。 Eclipse GC的吞吐量优于IntelliJ的吞吐量。
GC算法
GC暂停时间的主要原因之一是受垃圾收集算法和设置的影响。 Eclispe配置为与G1 GC算法一起运行,而IntelliJ配置为与CMS GC算法一起运行。 鉴于Eclipse通过适当的GC调整创建了更少的对象,我们相信Eclipse GC的暂停时间可以进一步减少。
System.gc()调用
显然,Eclispe IDE正在显式发出System.gc()调用。 除非有必要,否则不建议从应用程序中发出System.gc(),因为它与JVM GC活动混为一谈。 目前还不清楚为什么Eclipse IDE会明确发出System.gc()调用。
结论
根据我们进行的有限研究,我们可以说Eclipse IDE比IntelliJ具有更高的内存效率,因为要做相同的工作量,IntelliJ创建的对象比Eclipse多29倍。 另一方面,IntelliJ的暂停时间相对比Eclipse要好。 当然,我们认为IDE的选择不应基于内存效率。 它应基于功能集,用户首选项和生产率标准。
翻译自: https://www.javacodegeeks.com/2019/09/memory-efficient-eclipse-intellij-android-studio.html