Что такое java flags в майнкрафт

Тонкая настройка производительности JVM и среды исполнения Java

Вы думаете, что знаете о Java-программировании все? На самом деле большинство разработчиков только скребет по поверхности платформы Java, изучив ее лишь настолько, чтобы выполнять свою работу. В этом цикле статей Тед Ньюард углубляется в функциональные возможности платформы Java, выявляя малоизвестные факты, которые могут помочь в решении самых заковыристых задач программирования.

JVM ― рабочая лошадка, которая обеспечивает функциональность и производительность Java-приложений и которую большинство Java-разработчиков принимает как должное. И очень немногие действительно понимают, как JVM делает то, что она делает — такие вещи, как распределение объектов и сбор мусора, развертывание потоков, открытие и закрытие файлов, интерпретация и/или JIT-компиляция байт-кода Java и многое другое.

Незнание JVM дорого обходится с точки зрения производительности приложений, а когда что-то идет не так, оно может сильно затруднить попытки исправить положение.

Эта статья из цикла Пять секретов знакомит читателей с несколькими флагами командной строки JVM, которые можно использовать для диагностики и настройки производительности виртуальной машины Java.

Этот материал — часть knowledge path для развития ваших навыков. Смотри Стать Java-программистом

Я не могу сказать, сколько раз, когда меня просили проконсультировать по проблеме производительности приложений, быстрый grep по коду показывал то, что приведено в листинге 1 — классическую антимодель производительности Java.

Однако для решения этой конкретной проблемы инженеры Sun снабдили нас специальным JVM-флагом. Флаг -XX:+DisableExplicitGC автоматически превращает вызов System.gc() в no-op, предоставляя разработчику возможность запустить код и проверить, помогает ли операция System.gc() или вредит исполнению JVM в целом.

На JVM IBM ту же функцию, которая имеется на машинах JVM, основанных на технологии HotSpot, можно выполнить с помощью результата команды -Xdisableexplicitgc .

Случалось ли вам переживать такие дни, когда JVM загибается, выдавая сообщения OutOfMemoryError , а вы не можете заставить отладчик выловить причину? Такие спорадические или недетерминированные проблемы могут свести разработчика с ума.

Не все флаги командной строки обязательно поддерживаются VM, если только она не от Sun/Oracle. Лучший способ выяснить, поддерживается ли флаг, конечно, ― попробовать его и посмотреть, работает ли он. Однако если эти флаги технически не поддерживаются, вы несете полную ответственность за их использование. Ни я, ни Sun/Oracle, ни IBM® не будут отвечать за то, что в результате применения любого из этих флагов испарились ваш код, данные, сервер или ваша мама. В качестве меры предосторожности я советую сначала проверить их в виртуальной (непроизводственной) среде.

В таких случаях нужно сделать моментальный снимок кучи прямо в тот момент, когда JVM испускает дух — и именно это делает команда -XX:+HeapDumpOnOutOfMemoryError .

В механизме дампа JVM IBM эта возможность включена по умолчанию, гарантируя получение heapdump при наличии OutOfMemoryError . Механизм дампа IBM обеспечивает ряд параметров конфигурации, включая запрет дампов, посредством параметров командной строки -Xdump .

Полезно периодически направлять класс по пути classpath, который немного отличается от того, что входит в комплект JRE, или как-нибудь расширяет JRE. (Примером может служить новый поставщик API Java Crypto). Если нужно расширить JRE, то ваша специальная реализация должна быть доступна для загрузчика ClassLoader , который загружает java.lang.Object и всех его собратьев в rt.jar .

Хотя можно открыть rt.jar и ввести туда специальную реализацию или новый пакет, технически это было бы нарушением лицензии, с которой вы согласились, загружая JDK.

Вместо этого используйте собственный параметр JVM -Xbootclasspath и его сородичей -Xbootclasspath/p и -Xbootclasspath/a .

-Xbootclasspath позволяет задать полный путь загрузки classpath, который обычно должен включать ссылку на rt.jar , плюс куча других JAR-файлов, входящих в JDK и не являющихся частью rt.jar . -Xbootclasspath/p помещает значение в начало существующей переменной bootclasspath, а -Xbootclasspath/a ― в конец.

Если, к примеру, вы изменили массив java.lang.Integer и внесли изменения в подкаталог mods , то параметр -Xbootclasspath/a mods поместит новое значение Integer перед значением по умолчанию.

-verbose — полезная утилита диагностики первого уровня для Java-приложений практически любого типа. У этого флага три подфлага: gc , class и jni .

gc обычно становится первым, к чему прибегают разработчики, чтобы попытаться выяснить, не шалит ли сборщик мусора JVM и не стало ли это причиной низкой производительности. К сожалению, интерпретация выходных данных gc может оказаться затруднительной — настолько, что об этом можно написать целые книги. Еще хуже то, что данные, выводимые в командной строке, могут меняться от одного выпуска Java к другому или от одной JVM к другой, что еще больше затрудняет правильную интерпретацию.

class может быть спасением при попытке диагностировать ClassLoader или при конфликтах несоответствия классов. Он указывает не только время загрузки класса, но и место, откуда он был загружен, включая путь к файлу JAR, если он поступил из JAR.

jni полезен лишь при работе с JNI и собственными библиотеками. Когда он включен, он сообщает о различных событиях JNI, таких как момент загрузки собственных библиотек и привязки методов; опять же результат может варьироваться от одного выпуска к другому или одной JVM к другой.

Я перечислил некоторые из моих любимых параметров командной строки, предоставляемых JVM, но их очень много, так что читателю следовало бы провести собственное исследование. Запуск аргумента командной строки -X приводит к перечислению всех нестандартных (но в большинстве своем безопасных) аргументов, которые предоставляет JVM — например:

  • -Xint , который выполняет JVM в режиме интерпретации (это может быть полезно для проверки, оказывает ли JIT-компилятор влияние на код, и нет ли в нем ошибок);
  • -Xloggc: , который делает то же, что и -verbose:gc , но регистрирует события в файл, а не выбрасывает их в окно командной строки.

Параметры командной строки JVM время от времени меняются, так что полезно периодически просматривать их. От этого может зависеть, придется ли вам допоздна пялиться на монитор, или же вы придете домой в 5 часов вечера и сможете поужинать с супругой и детьми (или поубивать врагов в Mass Effect 2, смотря что вам больше нравится).

В JVM IBM вывод результатов verbose:gc в файл запрашивается с помощью параметра -Xverbosegclog , который также позволяет создать спецификацию файла журнала.

Флаги командной строки не предназначены для постоянного использования в производственной среде — на самом деле, помимо флагов, которыми вы (возможно) в конечном итоге воспользуетесь для настройки сборщика мусора JVM, ни один из нестандартных флагов командной строки не рассчитан на производственное применение. Но они бесценны как средство заглянуть внутрь работающей виртуальной машины, которая в остальных случаях абсолютно непрозрачна.

Далее в цикле Пять секретов…: Java-инструменты на каждый день.

Я только недавно натолкнулся на этот термин, и я не понимаю для чего они нужны и когда использовать.

Переменная флаг – это, как правило, переменная логического типа, значение который характеризует состояние некоторого объекта. В примере haveFive переменная которая хранит состояние есть ли в массиве пятерка.

Это переменная, которую вы можете использовать для управления потоком функции, позволяя вам проверять определенные условия во время выполнения вашей функции.

Не очень понятен вопрос, тем не менее попробую ответить в меру своего понимания.

Флаг это некая переменная, которая по сути является статусом некоторого объекта/сущности/множества. В классическом варианта флаг это булевская переменная, в более расширенном толковании флаг может иметь и несколько значений.

В зависимости от значения флага используется ветвление логики программы if и/или switch

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

Не могу не запостить цитату из любимого мною «Чистого кода»

Аргументы-флаги уродливы. Передача логического значения функции —
воистину ужасная привычка. Она немедленно усложняет сигнатуру метода, громко провозглашая, что функция выполняет более одной операции. При истинном значении флага выполняется одна операция, а при ложном — другая! В листинге 3.7 у нас нет выбора, потому что вызывающая сторона уже передает этот флаг, а я хотел ограничить область переработки границами функции. Тем не менее вызов метода render(true) откровенно сбивает с толку бедного читателя. Если навести указатель мыши на вызов и увидеть render (boolean isSuite), ситуация слегка проясняется, но ненамного. Эту функцию следовало бы разбить на две: renderForSuiteO и renderForSingleTestO.

-XX:+UseConcMarkSweepGC -XX:MaxGCPauseMillis=200
From FTB server:
-XX:+UseParNewGC -XX:+CMSIncrementalPacing -XX:+CMS >
Try:
-XX:+UseConcMarkSweepGC -XX:+CMSIncrementalPacing -XX:+CMS >
Looks like one of them is causing ConcuretnModificationException to happen during some recipe loading.

Copy link Quote reply

MaxGCPauseMillis causes ConcuretnModificationException

Copy link Quote reply

Copy link Quote reply

-Xms600m -Xmx2048m -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalPacing -XX:+CMS >

Copy link Quote reply

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...
Adblock
detector