Всем привет!
Что входит в состав JDK - Java Development Kit - кроме стандартной библиотеки Java?
Разные утилиты, сразу можно вспомнить java и javaс. Но не только они, есть еще ряд полезных консольных утилит, о которых расскажу ниже.
Сразу скажу, про таких монстров, как JVisualVM и Mission Control, стоит рассказать отдельно, что я и сделаю. Но потом)
Все утилиты лежат в папке bin внутри JDK.
Поехали:
1) javap - прочитать версию байткода, а также увидеть байткод в человекочитаемом виде.
Как запускать: javap -verbose Class1.class
2) jcmd - позволяет отправлять команды работающему процессу. Что за команды - да самые разные, например:
- сделать дамп кучи
- показать статистику использования памяти, причем после некоторых манипуляция - любых областей памяти, не только кучи
- время работы и другую информацию о JVM
- информацию о запущенных процессах
Если запусить jcmd без параметров - покажет список работающих java процессов.
Если запустить ее как jcmd PID - покажет доступные для процесса команды.
Описание почитать можно тут https://docs.oracle.com/en/java/javase/17/troubleshoot/diagnostic-tools.html#GUID-42A18B29-B4AD-4831-B846-2CDBA55F2254
3) jstat - показывает краткую статистику по Java процессу.
jstat -class PID - иннформация по загрузке классов
jstat -compiler PID - по JIT компиляции
jstat -gc PID - информация по работе GC, ее расшифровку и другие опции см. тут https://docs.oracle.com/en/java/javase/11/tools/jstat.html#GUID-5F72A7F9-5D5A-4486-8201-E1D1BA8ACCB5
Аналог линуксовых vmstat, iostat.
4) keytool - утилита для работы с сертификатами в формате jks.
5) jshell - начиная с Java 9 появляется консоль для выполнения Java кода интерактивно, без создания классов.
Что удобно: не нужно создавать класс, import-ы, ставить ; в конце строки, просто можно проверить выполнение какого-то простого кода.
6) jdeprscan - сканирует jar, класс или папку на наличие Deprecated API. Можно использовать в DevOps.
7) jconsole - графическая утилита для отображения использования CPU, памяти и другой информации, которую может отображать jcmd. Также показывает MBean-ы. Главное ее достоинство заключается в том, что она полностью бесплатна и есть в любой JDK.
При этом JVisualVM и Mission Control могут гораздо больше, но с ними есть нюансы)
Полный список утилит можно найти здесь: https://docs.oracle.com/en/java/javase/11/tools/tools-and-command-reference.html
#jdk #java #tools
Что входит в состав JDK - Java Development Kit - кроме стандартной библиотеки Java?
Разные утилиты, сразу можно вспомнить java и javaс. Но не только они, есть еще ряд полезных консольных утилит, о которых расскажу ниже.
Сразу скажу, про таких монстров, как JVisualVM и Mission Control, стоит рассказать отдельно, что я и сделаю. Но потом)
Все утилиты лежат в папке bin внутри JDK.
Поехали:
1) javap - прочитать версию байткода, а также увидеть байткод в человекочитаемом виде.
Как запускать: javap -verbose Class1.class
2) jcmd - позволяет отправлять команды работающему процессу. Что за команды - да самые разные, например:
- сделать дамп кучи
- показать статистику использования памяти, причем после некоторых манипуляция - любых областей памяти, не только кучи
- время работы и другую информацию о JVM
- информацию о запущенных процессах
Если запусить jcmd без параметров - покажет список работающих java процессов.
Если запустить ее как jcmd PID - покажет доступные для процесса команды.
Описание почитать можно тут https://docs.oracle.com/en/java/javase/17/troubleshoot/diagnostic-tools.html#GUID-42A18B29-B4AD-4831-B846-2CDBA55F2254
3) jstat - показывает краткую статистику по Java процессу.
jstat -class PID - иннформация по загрузке классов
jstat -compiler PID - по JIT компиляции
jstat -gc PID - информация по работе GC, ее расшифровку и другие опции см. тут https://docs.oracle.com/en/java/javase/11/tools/jstat.html#GUID-5F72A7F9-5D5A-4486-8201-E1D1BA8ACCB5
Аналог линуксовых vmstat, iostat.
4) keytool - утилита для работы с сертификатами в формате jks.
5) jshell - начиная с Java 9 появляется консоль для выполнения Java кода интерактивно, без создания классов.
Что удобно: не нужно создавать класс, import-ы, ставить ; в конце строки, просто можно проверить выполнение какого-то простого кода.
6) jdeprscan - сканирует jar, класс или папку на наличие Deprecated API. Можно использовать в DevOps.
7) jconsole - графическая утилита для отображения использования CPU, памяти и другой информации, которую может отображать jcmd. Также показывает MBean-ы. Главное ее достоинство заключается в том, что она полностью бесплатна и есть в любой JDK.
При этом JVisualVM и Mission Control могут гораздо больше, но с ними есть нюансы)
Полный список утилит можно найти здесь: https://docs.oracle.com/en/java/javase/11/tools/tools-and-command-reference.html
#jdk #java #tools
Oracle Help Center
Troubleshooting Guide
The Java Development Kit (JDK) provides diagnostic tools and troubleshooting tools specific to various operating systems. Custom diagnostic tools can also be developed using the APIs provided by the JDK.
Всем привет!
Помнится лет 10 назад был такой легендарный вопрос на баше: как пропатчить KDE2 под FreeBSD)
У меня канал немного про другое, но при прочтении данной статьи https://telegra.ph/Kak-sdelat-ssylki-na-metody-druzhelyubnymi-dlya-otladki-07-23 вспомнилось)
А вообще интересен тот факт, что пропатчить JDK как выясняется не так уж и сложно.
#jdk
Помнится лет 10 назад был такой легендарный вопрос на баше: как пропатчить KDE2 под FreeBSD)
У меня канал немного про другое, но при прочтении данной статьи https://telegra.ph/Kak-sdelat-ssylki-na-metody-druzhelyubnymi-dlya-otladki-07-23 вспомнилось)
А вообще интересен тот факт, что пропатчить JDK как выясняется не так уж и сложно.
#jdk
Telegraph
Как сделать ссылки на методы дружелюбными для отладки
В Java 8 появилось два вида функциональных выражений — лямбда-выражения вида s -> System.out.println(s) и ссылки на методы вида System.out::println. Поначалу ссылки на методы вызывали больше энтузиазма: они часто компактнее, вам не требуется придумывать имя…
Всем привет!
Когда-то давным-давно все, ну или почти все, использовали сборку JDK от Oracle. Хочу рассказать что же изменилось и что можно использовать сейчас.
В 2019 году Oracle изменила лицензионную политику и использовать JDK, а также JRE, бесплатно можно лишь для личных нужд. Версия, которую можно так использовать, получила название OpenJDK. Для коммерческих целей нужно приобретать лицензию, вне зависимости от того, нужна вам поддержка Oracle или нет. Эта версия - Oracle JDK. Кроме лицензионных условий сейчас эти сборки ничем не отличаются. Закон обратной силы не имеет, поэтому все предыдущие сборки можно использовать бесплатно, но любой hotfix JDK после 2019 года попадет под новые условия.
Это была первая проблема. Но кроме нее есть еще одна. Каждая версия OpenJDK от Oracle - это важно, что от Oracle - распространяется только полгода, потом идет переход на новую версию. И патчи выходят только для самой последней версии. Это касается и LTS - версий с долговременной поддержкой. Т.е Oracle OpenJDK 17 патчилась и распространялась полгода, потом стала доступна OpenJDK 18. Для тех, кто всегда готов к обновлениям - гуд) Но это не только лишь все)
Подробнее про это все можно почитать тут https://habr.com/ru/articles/448632/
Что же можно выбрать взамен? Есть довольно много компаний и opensource сообществ, которые берут исходники от Oracle OpenJDK, добавляют туда необходимые патчи, компилируют все это под определенные ОС и процессоры и выпускают для свободного скачивания. Отличаются они по следующим характеристикам:
1) набор версий Java. Как правило у всех есть 3 последние LTS - 8, 11, 17. У большинства есть последняя версия не LTS версия. У некоторых - даже 6-я и 7-я Java! А наличие 6-й Java означает не просто доступность ее для скачивания, но и обратное портирование туда критических патчей.
2) набор поддерживаемых ОС - Linux, Windows, MacOS
3) набор поддерживаемых процессорных архитектур - x64, x86 (32 бита), ARM
4) поддержка из коробки native image https://www.graalvm.org/native-image/
5) поддержка из коробки минималистичного образа Linux - Alpine. Я писал об различиях Docker образов тут https://t.me/javaKotlinDevOps/131
6) формат дистрибутива - инсталлятор, Docker образ. А если говорить про Дinux - поддержка разных менеджеров пакетов - rpm, deb...
7) формат поддержки - как правило он всегда доступен за деньги, но в некоторых случаях - JDK от ИТ гигантов - SAP, Microsoft, Amazon - поддержка доступна только вместе с продуктами этих компаний. Т.е. по сути эти JDK не для всех, а для тех кто использует соответствующее облако или продукт.
Неплохая статья со сравнением - https://bell-sw.com/blog/oracle-java-alternatives-comparison-of-openjdk-distributions
В конце статьи - сравнительная таблица.
Я бы особо выделил Temurin - JDK от Opensource сообщества и Liberica - JDK от российских разработчиков, который по перечисленным выше 7 пунктам обгоняет всех конкурентов.
P.S. Еще один интересный факт: IntelliJ также выпускает свою версию JDK - с доработками для отрисовки IDE UI.
#jdk #java
Когда-то давным-давно все, ну или почти все, использовали сборку JDK от Oracle. Хочу рассказать что же изменилось и что можно использовать сейчас.
В 2019 году Oracle изменила лицензионную политику и использовать JDK, а также JRE, бесплатно можно лишь для личных нужд. Версия, которую можно так использовать, получила название OpenJDK. Для коммерческих целей нужно приобретать лицензию, вне зависимости от того, нужна вам поддержка Oracle или нет. Эта версия - Oracle JDK. Кроме лицензионных условий сейчас эти сборки ничем не отличаются. Закон обратной силы не имеет, поэтому все предыдущие сборки можно использовать бесплатно, но любой hotfix JDK после 2019 года попадет под новые условия.
Это была первая проблема. Но кроме нее есть еще одна. Каждая версия OpenJDK от Oracle - это важно, что от Oracle - распространяется только полгода, потом идет переход на новую версию. И патчи выходят только для самой последней версии. Это касается и LTS - версий с долговременной поддержкой. Т.е Oracle OpenJDK 17 патчилась и распространялась полгода, потом стала доступна OpenJDK 18. Для тех, кто всегда готов к обновлениям - гуд) Но это не только лишь все)
Подробнее про это все можно почитать тут https://habr.com/ru/articles/448632/
Что же можно выбрать взамен? Есть довольно много компаний и opensource сообществ, которые берут исходники от Oracle OpenJDK, добавляют туда необходимые патчи, компилируют все это под определенные ОС и процессоры и выпускают для свободного скачивания. Отличаются они по следующим характеристикам:
1) набор версий Java. Как правило у всех есть 3 последние LTS - 8, 11, 17. У большинства есть последняя версия не LTS версия. У некоторых - даже 6-я и 7-я Java! А наличие 6-й Java означает не просто доступность ее для скачивания, но и обратное портирование туда критических патчей.
2) набор поддерживаемых ОС - Linux, Windows, MacOS
3) набор поддерживаемых процессорных архитектур - x64, x86 (32 бита), ARM
4) поддержка из коробки native image https://www.graalvm.org/native-image/
5) поддержка из коробки минималистичного образа Linux - Alpine. Я писал об различиях Docker образов тут https://t.me/javaKotlinDevOps/131
6) формат дистрибутива - инсталлятор, Docker образ. А если говорить про Дinux - поддержка разных менеджеров пакетов - rpm, deb...
7) формат поддержки - как правило он всегда доступен за деньги, но в некоторых случаях - JDK от ИТ гигантов - SAP, Microsoft, Amazon - поддержка доступна только вместе с продуктами этих компаний. Т.е. по сути эти JDK не для всех, а для тех кто использует соответствующее облако или продукт.
Неплохая статья со сравнением - https://bell-sw.com/blog/oracle-java-alternatives-comparison-of-openjdk-distributions
В конце статьи - сравнительная таблица.
Я бы особо выделил Temurin - JDK от Opensource сообщества и Liberica - JDK от российских разработчиков, который по перечисленным выше 7 пунктам обгоняет всех конкурентов.
P.S. Еще один интересный факт: IntelliJ также выпускает свою версию JDK - с доработками для отрисовки IDE UI.
#jdk #java
Хабр
Java теперь платная? Развенчиваем слухи (или нет?)
Уже 2 дня как вступили в силу изменения лицензионной политики Oracle на распространение сборок Java SE . В среде разработчиков-слоупоков (я тоже в их числе) начали носиться кошмарные слухи. Что...
Всем привет!
Какие компиляторы есть в Java? Сколько их вообще?
Простой ответ - один, называется javac. Им мы компилируем исходники в байт-код, который потом исполняет JVM.
Исполняет и что важно оптимизирует.
Вообще говоря, основные оптимизации происходят именно runtime, а javac является довольно простым.
Идея в том, что собирается статистика использования кода во время выполнения, часто используемый код компилируется в "нативный" - ассемблер для конкретного процессора, а неиспользуемый - удаляется. Таким образом получаем плюс еще один компилятор - JIT, он же Just in Time. Только на самом деле, исторически, компиляторов два - один быстрый, но оптимизирующий не оптимально))), второй - наоборот, медленный и хорошо оптимизирующий. C1 и C2, сейчас они используются в паре, подробнее можно почитать тут https://for-each.dev/lessons/b/-jvm-tiered-compilation
А можно без байт-кода? Да, есть AOT - Ahead of Time компилятор, называется native-image, поставляется в GraalVM https://www.graalvm.org/latest/reference-manual/native-image/
Он сразу компилирует в требуемый "нативный" код.
А если поддержки требуемой процессорной архитектуры нет? Был момент доминирования x86, но сейчас растет популярность ARM архитектур, а там, я так понимаю, тот еще зоопарк.
А для этого уже существует промежуточный язык и набор компиляторов LLVM https://llvm.org/. Что-то типа Java байт-кода, только не привязанный к Java. GraalVM его тоже поддерживает https://www.graalvm.org/latest/reference-manual/native-image/LLVMBackend/
А можно его использовать как runtime компилятор? Почему нет, в Azul JDK решили отказаться от C1\C2 и сделать свой компилятор с блекджеком и LLVM - https://www.azul.com/products/components/falcon-jit-compiler/ Да, ошибся немного, блекджека там, увы, нет)
А еще есть компиляторы Kotlin, Scala, Groovy, Jython, JRuby... И Kotlin native, также использующий LLVM https://kotlinlang.org/docs/native-overview.html В общем я сбился со счета)
#java #jvm #jdk #native_image #compilers
Какие компиляторы есть в Java? Сколько их вообще?
Простой ответ - один, называется javac. Им мы компилируем исходники в байт-код, который потом исполняет JVM.
Исполняет и что важно оптимизирует.
Вообще говоря, основные оптимизации происходят именно runtime, а javac является довольно простым.
Идея в том, что собирается статистика использования кода во время выполнения, часто используемый код компилируется в "нативный" - ассемблер для конкретного процессора, а неиспользуемый - удаляется. Таким образом получаем плюс еще один компилятор - JIT, он же Just in Time. Только на самом деле, исторически, компиляторов два - один быстрый, но оптимизирующий не оптимально))), второй - наоборот, медленный и хорошо оптимизирующий. C1 и C2, сейчас они используются в паре, подробнее можно почитать тут https://for-each.dev/lessons/b/-jvm-tiered-compilation
А можно без байт-кода? Да, есть AOT - Ahead of Time компилятор, называется native-image, поставляется в GraalVM https://www.graalvm.org/latest/reference-manual/native-image/
Он сразу компилирует в требуемый "нативный" код.
А если поддержки требуемой процессорной архитектуры нет? Был момент доминирования x86, но сейчас растет популярность ARM архитектур, а там, я так понимаю, тот еще зоопарк.
А для этого уже существует промежуточный язык и набор компиляторов LLVM https://llvm.org/. Что-то типа Java байт-кода, только не привязанный к Java. GraalVM его тоже поддерживает https://www.graalvm.org/latest/reference-manual/native-image/LLVMBackend/
А можно его использовать как runtime компилятор? Почему нет, в Azul JDK решили отказаться от C1\C2 и сделать свой компилятор с блекджеком и LLVM - https://www.azul.com/products/components/falcon-jit-compiler/ Да, ошибся немного, блекджека там, увы, нет)
А еще есть компиляторы Kotlin, Scala, Groovy, Jython, JRuby... И Kotlin native, также использующий LLVM https://kotlinlang.org/docs/native-overview.html В общем я сбился со счета)
#java #jvm #jdk #native_image #compilers
for-each.dev
Многоуровневая компиляция в JVM | for-each.dev
Компилятор JVM Rony in Time использует несколько методов для оптимизации нашего программного обеспечения по мере его запуска.
Мы исследуем различные уровни и то, как они влияют на производительность стартапов и постоянную оптимизацию.
Мы исследуем различные уровни и то, как они влияют на производительность стартапов и постоянную оптимизацию.