Ну, JVM имеет предварительно обработанные данные, но только для своих классов.Учитывая размер библиотеки JRE и тот факт, что она обычно не меняется, это большая победа (вы можете искать файлы под названием classes.jsa
).
Однако даже эти файлы не содержат собственный код, а только более простой в обработке байтовый код.
Большая точка генерации кода в JVM Hot Spot заключается в том, что они не компилируют код на основе класса или метода, как вы, кажется, думаете. Эти JVM компилируют фрагменты кода, охватывающие несколько взаимодействующих методов, поскольку взаимодействие обнаруживается во время самопрофилирования. Эти кодовые блоки могут охватывать методы из JRE, библиотек расширений, сторонних библиотек в вашем пути к классу и ваших классов приложений и, следовательно, действительны только для этой конкретной комбинации.
Во время компиляции будет использоваться информация, собранная о поведении вашей программы, например. пути кода, которые не были приняты, могут быть устранены, и можно утверждать, что условные выражения могут быть оценены с определенным результатом, как это было в предыдущих оценках. Это приводит к высокой производительности, но может случиться так, что JVM должен отказаться от кода даже во время того же выполнения, когда одно из утверждений больше не выполняется, например. программа может взять путь к коду, который он не делал раньше, или новый класс был загружен в JVM, который расширяет класс, код которого был оптимизирован как - если не имеет подклассов и т. д.
Так что если оптимизированный и скомпилированный код может оказаться устаревшим даже в пределах одной и той же среды, в еще одном случае он будет намного более устаревшим. В конце концов, JVM должен будет проверить, подходит ли старый код, который может оказаться даже более дорогостоящим, чем просто собирать данные и поведение новой среды.
Зачем тратить время на компиляцию кода, который, возможно, никогда не будет запущен в течение жизни JVM? – BarrySW19