четверг, 5 мая 2011 г.

Java launcher


Резюме
java [ options ] class [ argument ... ]
java [ options ] -jar file.jar [ argument ... ]

options
Опции командной строки.
class
Имя класса который нужно вызвать.
file.jar
Имя архива, котрый нужно вызвать. Используется только из ключем -jar.
argument
Аргументы, которые передаются в функцию main.

Описание
Инструмент java запускает Java приложения. Это он делатет запуская Ява рантайм-окружение, загружая указанный классы и вызывая его метод "мейн".
Мейн-метод должен быть обьявленным как публичный статический, ничего не возвращать, получать массив строк как параметр. Вот так должно выглядеть его обьявление:

public static void main(String args[])
По-умолчанию перевый неопциональный аргумент--это имя класса, который нужно вызвать. Полное имя класса должно быть указано(с иерархией пакетов). Если используется -jar опция, то нужно указывать имя джар-архива, в котором содержатся классы и рессурсы, необходимые приложению, а также стартапный класс(с методом "мейн"), который указывается в заголовке Main-Class манифеста.
Джава-рантайм ищет стартапный класс и дргугие классы, которые им используются ( эти классы ищутся в трех местах: бутстрапные библиотеки, в расширениях библиотеках, и в пользовательском класспазе).
Неопциональные аргументы, указанные после имени класса или джар-архива, передаются в "мейн"-функцию.

javaw идентично ланчеру java, но отличается тем, что при запуске приложение не свзяывает с ним консольное окно. Если ошибка случится в приложении запущенном таким ланчером, то появится окно с описанием ошибки.

Опции

Ланчер имеет набор стандартных опций, те которые будут присутствовать и в последующих версиях платформы, а также нестандартные -- которые характерны для поточной платформы и вероятнее всего в следующей их не будет.

Стандартные опции


-client
Таким образом мы выбираем Java HotSpot Client VM.  64-bit capable jdk на данный момент игнорирует эту опцию, и исользует вместо нее Java HotSpot Server VM. Что это за вируальные машины?

Первоначально это было придумано для того, чтобы на клиентских пк запускать виртуальную машину макисмально быстро, при этом сама эффективность выполнения приложения не так важна, как скорость запуска -- ведь это клиентское приложение, они обычно легкие и простые. Серверные виртуальные машины должны максимально быстро давать ответ на запрос, поэтому скорость старта такой машины не важна, потому что она запускается раз в длительный промежуток времени и работает отвечая на запросы. Зато скорость работы(эффективность) такой машины крайне важна. С 6-й платформы серверной считаются все машины, которые имеют 2+ ядра процессора и 2+ Гб оперативки.

-server
Выбираем Java HotSpot Server VM. На 64-bit capable jdk только поддерживается Java HotSpot Server VM, таким образом опиця -server неявная.  В последующих рилизах это условие изменят, потому что уже практически нетбуки собираются на базе многоядерных архитектур
-agentlib:libname[=options]
Загрузка родной агентской библиотеки  libname, например: -agentlib:hprof -agentlib:jdwp=help -agentlib:hprof=help. Например -agentlib:foo=opt1,opt2, то для виндовой платформы -- foo.dll, для солярисной -- libfoo.so.
-agentpath:pathname[=options]
Загружает родную для платформы(*.dll или *.so) агентную библиотеку с указанием полного пути к ней. Эта один из варинатов доступа к JVM(ТМ) Tool Interface (интерфейс доступа к виртуальной машине для утилит разработки и мониторинга).
-classpath classpath
-cp classpath
Определяет список директорий, JAR-архивов, и ZIP-архивов, в которых происходит поиск классов. Элементы этого списка разделяются :/;(в зависимости от платформы). Определение -classpath или -cp перегружает переменную окружения CLASSPATH. Если не -classpath, -cp, не CLASSPATH не установлены, но поиск будет производиться в поточной директории(.). Для удобства, можно в конце  поставить *, в этом случае в класс паз попадут все классы из архивов .jar или .JAR, которые находятся по этому пути.
-Dproperty=value
Установить системное свойство. Если значение состоит из нескольких слов через пробел, то нужно значения брать в кавычки:
java -Dfoo="some string" SomeClass
        
-enableassertions[:<package>"..." |:<class> ]
-ea[:<package>"..." | :<class> ]
Включить предположения. Они по умолчанию выключены. Без аргументов опции -enableassertions или -ea включают все предположения. Если у нас есть один аргумент, который заканчивается на "...",  то включаются предположения для указанного(в аргументе) пакета и всех его подпакетов. Если аргументом является просто значение "...",  то включаются предположения для неименованного пакета в поточной директории. Если аргумент не заканчивается "...", то предположения будут включены только для конкретного класса. Если в одной командной строке будут указаны много таких переключателей, то они будут обработаны по порядку до загрузки классов. Вот пример, мы включает предположения для пакета  com.wombat.fruitbat и всех его подпакетов:
java -ea:com.wombat.fruitbat... 
Безаргументный вызов этой опции включает предположения для всех классов кроме системных, чтобы включить системным нужно использовать опцию -enablesystemassertions.
-disableassertions[:<package>"..." |:<class; ]>
-da[:<package>"..." | :<class> ]
Выключение предположений. Это делается виртуальной машиной неявно по-умолчанию, и эквивалентно явному указанию опций -disableassertions или -da без аргументов. С указанием в конце аргумент "...", выключает предположения только для указанного пакета и его подпакетов. Если аргумент "...", то выключаются предположения для неименованного пакета в the rent working directory. Если аргумент без "...", то предположения выключаются для конкретного класса. Вот пример как включить предположения в пакете com.wombat.fruitbat, но выключить в классе com.wombat.fruitbat.Brickbat:
java -ea:com.wombat.fruitbat... -da:com.wombat.fruitbat.Brickbat <Main Class>
 -disableassertions and -da без аргументов выключают предположения во всех классах, кроме системных. Чтобы выключить в системных нумжно использовать опцию -disablesystemassertions.
-enablesystemassertions
-esa
Включить предположения во всех системных классах (устанавливает assertion status for system classes = true).
-disablesystemassertions
-dsa
Выключить предположения для всех системных классов.
-jar
Выполнить приложение вложенное в  JAR файл. Первый аргумент это JAR имя файла вместо имени стартапного класса. Чтобы эта опция работала манифест JAR-файла должен содержить Main-Class: classname, где класснейм это имя стартапного класса в архиве. See the Jar tool reference page and the Jar trail of the Java Tutorial for information about working with Jar files and Jar-file manifests. При использовании этой опции используются только классы из архива, все остальные пользовательские класспазы игнорируются.
-javaagent:jarpath[=options]
Загружается Java programming language agent, смотреть java.lang.instrument.
-verbose
-verbose:class
Показывается вся информация о каждом загруженном классе.
-verbose:gc
Пишется отчет о каждом вызове сборщика мусора.
-verbose:jni
Пишется отчет о каждом вызове родных методов и вообще любое использование Java Native Interface.
-version
Выводится информация о платформе  и утилита закрывается.
-version:release
Определяем какая версия платформы нужна для вызова указанного класса или приложения в архиве. Если платформа, с которой работает утилита, не является указанной, то утилита пытается найти эту платформу в системе, при успешном нахождении, нужная платформа вызывается и ей предается на выполнения указанный класс/архив release может не только определять версию, но также формировать, так называемую, строку версий. Это список упорядоченных диапазонов, разделенных пробелами. Диапазон -- это либо version-id, либо version-id, за которым звезда (*), a version-id за которым знак плюса (+) , или два диапазона объединенных амперсандом (&). Звездочка указывает на наличие там префикса, плюс означает поточная(указанная перед +) или выше версия, и амперсанд означает логическое И между двумя диапазонами. Пример:
-version:"1.5.0_04 1.5*&1.5.1_02+"
Класс или jar-файл нуждается в версии 1.5.0_02, или в версии, для которой 1.5 является префиксом, но при этом версия платформы должна быть не ниже 1.5.1_02. Точное определение версионных строк можно найти в Appendix A of the Java Network Launching Protocol & API Specification (JSR-56). Для jar-файлов, лучше версии указывать в манифесте, чем в опции командной строки.Обратить также внимание на заметки в конце данного поста.
-showversion
Показать информацию о версии и продолжить.
-?
-help
Показывается хелп и утилита закрывается.
-X
Показывается информация о нестандартных опциях, который присутствуют в данной платформе и утилита закрывается.

Нестандартные опции в присущие в платформе 6


-Xint
Действовать только в режиме интерпритатора. Компиляции в родной код проиводиться не будет и байткод будет только выполняться интерпретатором. В этом режиме преимущества адаптивного компилятора Java HotSpot Client VM не будет использоваться.
-Xbatch
Отключает фоновую компиляцию. Обычно виртуальная машина в фоне проводит компиляцию, а пока она не завершилась, интерпретирует по ходу приложение и оно уже начинает работать до полного завершения компиляции. В этом режиме компиляция становится основной задачей и приложение не запуститься до тех пор пока все не будет откомпилированно.
-Xbootclasspath:bootclasspath
Через разделитель характерный для платформы указываются списки директорий и JAR-, ZIP-архивов для поиска бутсрапных классов. Note: приложения, которые используют эту опцию для перегрузки класса в rt.jar не должны деплоится в таких условиях, потому что так будет нарушена лицензия Java 2 Runtime Environment binary code license.
-Xbootclasspath/a:path
Так директории и архивы добавятся в конец к уже существующему списку бутсрапных классов.
-Xbootclasspath/p:path
А так директории и архивы добавятся в начало уже существующего списка бутсрапных классов. Примечание: приложения, которые используют эту опцию для перегрузки класса в rt.jar не должны деплоится в таких условиях, потому что так будет нарушена лицензия Java 2 Runtime Environment binary code license.
-Xcheck:jni
Производится дополнительная проверка функций из Java Native Interface (JNI). Особенно, the Java Virtual Machine проверяет параметры, которые передаются в  JNI функции, также как runtime environment data до JNI запроса. Любые неправильные данные выявляют проблему в родном коде и Java Virtual Machine прекратит работу с фатал еррором в таком случае. Когда эта опция включена, то наблюдается ухудшение производительности.
-Xfuture
Выполняет строгую проверку формата класс-файлов. С целью обратной совместимости, по-умолчанию проверка формата выполняемая виртуальной машиной Java 2 SDK  не строже чем проверка виртуальной машины версии 1.1.x. Включение флага -Xfuture способствует более строгому соответсвию формата класс-файлов спецификации. Этим флагом лучше пользоваться при разработке, потому что в дальнейших релизах платформы проверка формата будет без вариантов строгой.
-Xnoclassgc
Отключает сборку мусора классов. Использование этой опции защитит от восстановления памяти загруженные классы, хотя при этом возрастет объем использования памяти. Также эта опция может привести к OutOfMemoryError.
-Xincgc
Включает возрастающий сборщик мусора. По-умолчанию он отрублен. Он уменьшает случайные длинные паузы сборки мусора во время выполнения программы. Инкриментальный сборщик конкурирует с приложением за время выполнения процессора, поэтому он будет приводить не к таким длительным задержкам приложения, как в случае, если бы у него был приоритет выше.
-Xloggc:file
Логирует каждое событие вызова сборщика, как в случае с -verbose:gc, только вот лог идет не в стандартный поток вывода(консоль), а в файл. Нужно всегда использовать локальный файл, потому что сетевые соединения могут серьезно задерживать дальнейшую работу виртуальной машины после записи в такой файл. Эта опция перегружает -verbose:gc, если указаны обе. Если файловая система обрежет этот файл из-за ее переполнения, то это никак не повлияет на процесс логирования событий сборщика, приложение продолжит выводить события в обрезанный файл.
-Xmsn
Определяется начальный размер в байтах под выделенную память пула. Значение должно быть кратно 1024 и больше 1MB. Если добавить букву k или K то приложение поймет, что это значение в килобайтах, также можно писать m или M -- это мегабайты. Значение по-умолчанию выбирается в момент выполнения основываясь на системных настройках. Детальнее на HotSpot Ergonomics Примеры:
-Xms6291456
-Xms6144k
-Xms6m      
-Xmxn
Определяется максимально возможный размер памяти под пул. Варианты задания значений точно такие же как в предыдущей опции. Детальнее на HotSpot Ergonomics. Примеры:
-Xmx83886080
-Xmx81920k
-Xmx80m
       
-Xprof
Ведение профайла работающей программы, данные выводятся в стандартный поток вывода. Полезно на этапе разработки, но не предназначено для продакшина.
-Xrs
Уменьшает использование сигналов ОС виртуальной машиной(JVM). Опция существует начиная с версии J2SE 1.3.1. В J2SE 1.3.0, возможность Shutdown Hooks было добавлено, что позволило аккуратно закрывать явовские приложения.  Цель этого была позволить пользователям выполнять очищающий код, даже если работа виртуальной машины обрывается внезапно (это применимо например для закрытия связей с базой данных). Консольный наблюдатель виртуальной машины контролирует события для реализации хуков шатдауна в случае ненормальной остановки виртуальной машины. А именно JVM регистрирует консольный контроллер, который начинает обработку хуков шатдауна и возвращает истину для CTRL_C_EVENT, CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT, и CTRL_SHUTDOWN_EVENT. JVM использует подобный механизм для реализации пре-1.2 особенности слива(дампинга) стека средов с целью дебага. Оракловская JVM использует CTRL_BREAK_EVENT для выполнения средовых дампов. Если JVM работает как сервис(н-р: движок сервлетов в веб-сервере), то она может получить CTRL_LOGOFF_EVENT, но в этом случае она не должна начинать шатдаун до тех пор, пока ОС фактически не терминейтнет процесс. Чтобы избежать таких взаимопомех эта опция  -Xrs была добавлена в платформу начиная с версии J2SE 1.3.1. Когда опция -Xrs используется на Оракловской JVM, виртуалка не устанавливает консольный контроллер, подразумевая, что не нужно наблюдать и обрабатывать события CTRL_C_EVENT, CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT, и CTRL_SHUTDOWN_EVENT. Последствия включения опции -Xrs:
  • Ctrl-Break thread dumps не доступны.
  • За вызов хуков шатдауна ответсвенный пользовательский код, пример такого вызова -System.exit(), когда необходимо остановить виртуальную машину.
-Xssn
Устанавливается объем стека нити(среда).

Комментариев нет:

Отправить комментарий