Эта статья представляет собой эксклюзивную статью в серии «Вы не знаете 5 ...» для разработчиков. Тем не менее, немногие из нас могут понять, как JVM выполняют свою работу - например, распределение задач и сбор мусора, поворот потоков, открытие и закрытие файлов, прерывание и/или JIT составление Java Bytecode и так далее.
Не знание JVM не только повлияет на производительность приложений, но и попытается исправить ее, когда возникает проблема с JVM.
В этой статье будут представлены некоторые флаги командной строки, которые вы можете использовать для диагностики и настройки вашей виртуальной машины Java.
1. disableExplicitgc
Я не могу вспомнить, сколько раз пользователь просил меня проконсультироваться о проблемах производительности приложений.
Листинг 1. System.gc ();
Кода -копия выглядит следующим образом:
// мы только что выпустили кучу объектов, так что скажите глупости
// Сборщик мусора, чтобы забрать их уже!
System.gc ();
Откровенная коллекция мусора - очень плохая идея - например, заблокировать вас и сумасшедший бульдог в телефонной будке. Хотя синтаксис вызова реализован в зависимости, если в вашем JVM работает сборщик мусора поколений (в основном System.gc (); заставляет виртуальную машину выполнять «развертку» кучи, хотя некоторые не являются необходимыми. Вся чистка на заряды на величину дороже, чем обычная операция GC, и это просто простая математическая проблема.
Вы не можете взять мои слова близко к сердцу - инженеры Sun предоставляют флаг JVM для этой специальной ошибки вручную; может увидеть, является ли System.gc () вредным или полезным для всего выполнения JVM.
2.Heapdumponoutofmemoryerror
Вы когда -нибудь испытывали ситуацию, когда нельзя использовать JVM, постоянно бросая OutofmemoryError, и вы не можете создать для себя отладчика, чтобы поймать его или посмотреть, что не так? Серьезные и/или неопределенные проблемы, подобные этому, часто сводят разработчиков с ума.
Покупатель несет ответственность за его собственную
Не все флаги командной строки поддерживаются любыми виртуальными машинами, за исключением VMS Sun/Oracle. Лучший способ выяснить, поддерживается ли флаг - это попробовать его и посмотреть, работает ли он должным образом. Если эти логотипы не поддерживаются технически, вы несете полную ответственность за их использование. Я, Sun/Oracle и IBM не будут нести ответственность, если какой -либо из этих флагов сделает ваш код, ваши данные, ваш сервер или все, что вы исчезаете без следа. На всякий случай, рекомендуется сначала экспериментировать в виртуальной (очень производственной) среде.
В этот момент вы хотите сделать снимок кучи, когда умирает JVM - только команда -xx:+HeapdumponoutofmemoryError может сделать это.
Запуск команды уведомляет JVM для получения «снимка выброса кучи» и сохранить его в файле для обработки, обычно используя утилиту JHAT (я описал его в предыдущем посте). Вы можете указать фактический путь к сохраненному файлу, используя соответствующий флаг -xx: heapdumppath. (Независимо от того, где файл сохраняется, убедитесь, что файловая система и/или Java -процессы должны иметь разрешения для настройки и можно записать там.)
3.bootclasspath
Полезно регулярно помещать класс в дорожку класса, что немного отличается от трассы, которая поставляется с инвентаризацией JRE или The Jre Classpath, которая каким -то образом расширена. (Пример - новый провайдер Crypto API Java). Если вы хотите расширить JRE, ваша настраиваемая реализация должна иметь возможность использовать ClassLoader BootLoader, который может загрузить java.lang.object в rt.jar и все связанные с ним файлы.
Хотя вы можете незаконно открыть RT.JAR и переместить в нее свою пользовательскую реализацию или новые пакеты, вы технически нарушили соглашение, согласившиеся при загрузке JDK.
Вместо этого используйте собственную опцию jvm -xbootclasspath, а также скины -xbootclasspath/p и -xbootclasspath/a.
-Xbootclasspath позволяет вам установить полную загрузочную точку класса (это обычно включает в себя ссылку на rt.jar), а также некоторые другие файлы JDK-доступных JAR (не часть RT.Jar). -Xbootclasspath/P предшествует значению в существующий Bootclasspath и добавляет к нему -xbootclasspath/a.
Например, если вы изменили java.lang.integer в библиотеке и разместили модификацию в модах подпала, параметр -xbootclasspath/AMOD ставит новое целое число перед параметрами по умолчанию.
4.вербоз
Для виртуального или любого типа Java -приложения --вербозе является полезным диагностическим приложением первого уровня. Логотип имеет три суб-лого: GC, класс и JNI.
Разработчики пытаются выяснить, не работает ли коллектор мусора JVM. К сожалению, объяснение вывода GC является громоздким - достаточно, чтобы написать книгу. Хуже того, выход, напечатанный в командной строке, изменяется в разных версиях Java или не в разных JVM, что затрудняет правильную интерпретацию.
Вообще говоря, если сборщик мусора является коллекционером поколений (большинство виртуальных машин «на уровне предприятия»). Кажется, что какой -то виртуальный флаг указывает на полную пробку GC;
Класс может помочь вам, если вы хотите диагностировать класс загрузчика и/или несоответствующие конфликты классов. Он не только сообщает, когда класс загружен, но и там, где загружается класс, включая путь к банке (если из банки).
JNI редко используется, за исключением случаев использования JNI или локальных библиотек. При открытии он будет сообщать о различных событиях JNI, например, когда локальная библиотека загружена, и когда метод отскочивает назад;
5.command-line-x
Я перечислил параметры командной строки, которые мне нравятся в JVM, но есть еще несколько вещей, которые вам нужно найти, запустив аргумент командной строки -x, перечисляя все нестандартные (но в основном безопасные), предоставленные JVM ) Параметры - например:
-Xint, запустив JVM в интерпретированном режиме (что полезно для проверки, действительно ли компилятор JIT действительно работает для вашего кода или проверка, если есть ошибка в компиляторе JIT).
-Xloggc:, и -verbose: GC делайте то же самое, но регистрируйте файл, не выводя его в окно командной строки.
Параметры командной строки JVM время от времени меняются, поэтому рекомендуется регулярно проверять ее. Даже вы смотрите на монитор поздно ночью и идете домой в 5 часов вечера на ужин с женой и детьми (или уничтожаете своих врагов в Mass Effect 2, в зависимости от ваших предпочтений), все они разные.
Заключение
В производственных средах флаги командной строки не предназначены для постоянного использования-на самом деле, за исключением флагов, которые вы прекращаете, чтобы настроить коллекционер мусора JVM, не стандартный флаг командной строки не предназначен для использования производства. Тем не менее, он очень полезен в качестве инструмента, чтобы шпионить за внутренней работой виртуальных машин, которые в остальном совершенно непрозрачны.