Эффективная память: Eclipse или Intellij?

Начни писать сюда…

Eclipse и IntelliJ — две конкурирующие IDE в отрасли. В социальных сетях и на форумах идет много страстных дискуссий, чтобы объявить победителя в этой гонке. Мы подумали, что было бы интересно изучить, какая IDE эффективно использует память?

Исследование
Для проведения этого исследования мы использовали Eclipse Java EE Oxygen Release Milestone 2 (4.7.0 M2) и IntelliJ IDEA 2018.2.4 (Ultimate Edition). Обе IDE работали на Java 8.

Для эффективного проведения этого исследования мы хотели активировать различные функции IDE. Таким образом, мы создали простой Java-проект. В этом проекте мы создали страницу JSP, класс Manager, класс DAO, который будет записывать и читать записи из базы данных MySQL. Мы писали исходный код, компилировали его, запускали модульные тесты для проверки поведения. На все эти действия у нас ушло 1 час 45 минут. Мы провели одно и то же упражнение как в Eclipse, так и в IntelliJ IDE.

Как изучить эффективность памяти?
Один из лучших способов изучить поведение приложения с памятью — проанализировать активность сборки мусора. Действия по сборке мусора будут четко отображать шаблон использования памяти, скорость создания объектов, скорость восстановления объектов, время паузы сборки мусора и другие детали, связанные с памятью в nirvana.

Как изучить деятельность по сбору мусора?
Действия по сборке мусора можно изучить, включив журналы сбора мусора и используя правильные инструменты для анализа журналов сбора мусора. Журналы сбора мусора можно включить, передав следующие аргументы JVM:


-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 составляет 128 МБ, а максимальный размер кучи равен 750 МБ. Принимая во внимание, что начальный размер кучи Eclipse был установлен на 256 МБ, а максимальный размер кучи — на 1024 МБ. Таким образом, чтобы сравнить яблоки с яблоками, мы увеличили начальный размер кучи IntelliJ до 256 МБ, а максимальный размер кучи — до 1024 МБ.

Сравнение поведения памяти
После завершения нашего 1-часового и 45-минутного упражнения мы загрузили файл журнала сборки мусора, созданный обеими IDE, в инструмент GCeasy. Ниже приведены подробные аналитические отчеты, созданные инструментом. Предлагаем вам ознакомиться с отчетом:

Отчет об анализе Eclipse GC
Отчет об анализе IntelliJ GC

затмение-память-2.png
Рис. Использование памяти Eclipse IDE

intellij-memory-2.png
Рис. Использование памяти IntelliJ IDE

№1. Скорость создания объектов
По-видимому, Eclipse создал очень небольшое количество объектов по сравнению с IntelliJ. Eclipse IDE создавала объекты со скоростью 2,41 МБ/с, тогда как IntelliJ создавала объекты со скоростью 69,65 МБ/с (что примерно в 29 раз больше, чем у Eclipse). За весь прогон Eclipse создал всего 15,19 ГБ, тогда как IntelliJ создал 430,2 ГБ объектов. Поскольку было создано больше объектов, потребление ЦП также было выше при использовании IntelliJ IDE.

№ 2. Время паузы ГХ
На определенных этапах сборки мусора все приложение приостанавливается. Судя по всему, среднее время паузы GC в Eclipse составляет 33 мс, а максимальное время паузы GC — 340 мс. С другой стороны, среднее время паузы GC в IntelliJ составляет всего 8 мс, а максимальное время паузы GC — 270 мс. Таким образом, с точки зрения GC Pause IntelliJ сравнительно лучше. Несмотря на то, что скорость создания объектов в IntelliJ выше, среднее время паузы в нем сравнительно лучше, чем в Eclipse, из-за лучшей настройки GC, выполненной в IntelliJ.

№3. Пропускная способность ГХ
Пропускная способность GC — это, по сути, количество времени, которое ваше приложение тратит на обработку транзакций клиента, по сравнению с количеством времени, которое ваше приложение тратит на сборку мусора. В нашем исследовании пропускная способность Eclipse составляет 99,924 %, а пропускная способность IntelliJ — 99,146 %. Пропускная способность Eclipse GC выше, чем у IntelliJ.

№ 4. Алгоритм сборки мусора
Одна из основных причин задержки сборки мусора связана с алгоритмом и настройками сборки мусора. Eclispe был настроен для работы с алгоритмом G1 GC, тогда как IntelliJ был настроен для работы с алгоритмом CMS GC. Учитывая, что Eclipse создает гораздо меньше объектов, при правильной настройке сборщика мусора мы считаем, что время паузы сборщика мусора Eclipse можно еще больше сократить.

№ 5. System.gc() вызывает
По-видимому, Eclispe IDE явно вызывает вызовы System.gc(). Если нет необходимости, не рекомендуется запускать System.gc() из приложения, так как это мешает работе JVM GC. Непонятно, почему Eclipse IDE явно вызывает вызовы System.gc().

Вывод
Основываясь на этом ограниченном исследовании, которое мы провели, мы можем сказать, что Eclipse IDE эффективнее использует память, чем IntelliJ, потому что для выполнения того же объема работы IntelliJ создает в 29 раз больше объектов, чем Eclipse. С другой стороны, время пауз IntelliJ сравнительно лучше, чем у Eclipse. Конечно, мы считаем, что выбор IDE не должен основываться на эффективности использования памяти. Он должен основываться на наборе функций, предпочтениях пользователя и критериях производительности.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *