Разберите Java JIT скомпилированный собственный байт-код - PullRequest
27 голосов
/ 02 августа 2011

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

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

Ответы [ 5 ]

17 голосов
/ 02 августа 2011

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

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

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

3 голосов
/ 06 февраля 2012

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

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

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

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

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

Ваш код -> IKVM.NET -> Mono -> LLVM -> Собственный исполняемый файл

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

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

РЕДАКТИРОВАТЬ: Вы также можете использовать LLVM VMKit , чтобы скомпилировать код Java в машинный код. Концептуально это тот же процесс, который я описал с Mono, но не допускать этого неприятного CIL-материала.

3 голосов
/ 02 августа 2011

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

1 голос
/ 23 января 2013

Да, я также думал, что было бы трудно получить нативный вывод 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

1 голос
/ 29 марта 2012

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

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

...