Подтвердить что ты не робот

Разберите Java JIT скомпилированный собственный байт-код

Есть ли способ сделать дамп сборки собственного кода, сгенерированного компилятором Java точно в срок?

И связанный с этим вопрос: есть ли способ использовать JIT-компилятор без запуска JVM для компиляции моего кода в собственный машинный код?

4b9b3361

Ответ 1

Да, есть способ распечатать сгенерированный собственный код (требуется OpenJDK 7).

Нет, невозможно скомпилировать ваш байт-код Java в собственный код с помощью JDK JIT и сохранить его как родной исполняемый файл.

Даже если бы это было возможно, это, вероятно, было бы не так полезно, как вы думаете. JVM делает некоторые очень сложные оптимизации, и при необходимости может даже оптимизировать код "на лету". Другими словами, это не так просто, как JIT компилирует ваш код на собственный машинный язык, а затем этот собственный машинный язык останется неизменным во время работы программы. Кроме того, это не позволит вам создать собственный исполняемый файл, который не зависит от JVM и библиотеки времени исполнения.

Ответ 2

Если Amigable Clark Kant подумал, что ваш вопрос был ересью, он действительно перевернет этот ответ. Введите это под "что возможно" не обязательно под "рекомендацией Джастина".: -)

Один из вариантов заключается в использовании IKVM.NET для обработки вашего Java-кода с помощью Mono. IKVM.NET позволяет запускать Java-код поверх .NET или Mono CLR. Некоторые могут сказать, что вы пропускаете JVM таким образом, хотя было бы более точным сказать, что IKVM.NET - это действительно реализация JVM, которая работает на CLR.

Во всяком случае, если вы сделаете это, теперь у вас есть возможность сделать "Вперед" (AOT) компиляцию вашего кода с Моно. То есть, вы можете скомпилировать свой код до самого машинного носителя, что означает, что вам не нужна среда CLR или JVM во время выполнения.

В отличие от того, что говорит Йеспер, использование компиляции AOT может привести к повышению производительности. Хотя верно, что JVM (и CLR) выполняют некоторые оптимизации во время выполнения, которые невозможно во время компиляции, верно и обратное. Кроме того, одним из вариантов является использование LLVM для генерации кода, что обычно приводит к повышению производительности.

Вот конвейер в двух словах:

Ваш код → IKVM.NET → Моно → LLVM → Нативный исполняемый файл

Или просто используйте компилятор Java, который предназначен для AOT, с самого начала генерирует собственные исполняемые файлы (например, GCJ или Excelsior Jet).

Одно из мест, которое может быть полезно для параметра Mono/IKVM.NET, - это если вы хотите использовать библиотеку Java как часть приложения для iPhone (используя MonoTouch). В App Store доступны только исходные двоичные файлы.

EDIT: Вы также можете использовать LLVM VMKit для компиляции кода Java в машинный код. Это концептуально тот же процесс, который я описал с помощью Mono, но сохраняя этот неприятный материал CIL на картинке.

Ответ 3

Вы не можете использовать JIT для создания автономного исполняемого файла, вам понадобится другая система, например GCJ. Что касается просмотра кода, созданного JIT, проверьте источник OpenJDK на поиск параметров отладки. Вы можете создать свою собственную копию с включенными функциями и посмотреть, что делает JIT, или добавить свои собственные улучшения для вывода того, что вам нравится.

Ответ 4

Ознакомьтесь с Oracle Solaris Studio Performance Analyzer. Я видел Чарли Ханта на конференции, и это было просто захватывающе. Он позволяет выполнять отладку и разборку приложений Java во время выполнения, то есть просматривать машинные инструкции с выделенными горячими точками. Смотрите также эту выдержку из книги: http://charliehunt.ulitzer.com/node/2067673

Дополнительная документация: Oracle Solaris Studio 12.2: анализатор производительности

Ответ 5

Да, я тоже думал, что будет трудно получить выход JIT, но в этой газете парней показывается собственный код, но он не говорит, как он получил результат. Я могу понять, будет ли результат компилятора JIT непоследовательным, поскольку он будет время от времени меняться или очищаться от кеша кода только для регенерации позже, но как получить быстрый снимок некоторой сборки для некоторых блоков кода.: |

http://www.google.com/url?sa=t&rct=j&q=Java+annotation+for+optimization&source=web&cd=15&ved=0CKEBEBYwDg&url=http%3A%2F%2Floome.cs.uiuc.edu%2Fpubs%2Fjones-kamin.pdf&ei=8vj-UN63C-bQ2QX-9IDoDQ&usg=AFQjCNEegMNXLwKyUTTJ5ljgnP7X9rPXHg&bvm=bv.41248874,d.b2I