Как делают “современный JVMs”, отличаются от более старого JVMs?

Вот фраза, что я слышал много всюду по занятиям по информатике средней школы и университета:

"Это не проблема для современного JVMs".

Обычно это подходило бы в дискуссиях о стратегиях оптимизации или общей производительности. Это всегда рассматривали как своего рода волшебный окончательный ответ, тем не менее, как будто это делает проблемы больше не стоящими взглядов о. И это просто приводит меня задаваться вопросом: каковы различия между формирующей прототип "современной JVM" и более старым JVMs, действительно?

6
задан 2 revs, 2 users 100% 12 June 2010 в 09:52
поделиться

3 ответа

Самое значительное улучшение в технологии JVM - компилятор JIT: Just In Time. JIT оптимизирует код в процессе работы, тем самым получая огромный прирост производительности, что делает Java (по крайней мере, в некоторых областях) конкурентоспособной с программами на Си/Си++.

Интересную дискуссию о преимуществах динамической оптимизации (в процессе работы кода) в сравнении со статической оптимизацией (во время компиляции) можно найти в выступлении Стива Йегге: http://steve-yegge.blogspot.com/2008/05/dynamic-languages-strike-back.html (что, собственно, BTW интересно).

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

.
6
ответ дан 8 December 2019 в 18:37
поделиться

Раньше неконтролируемая синхронизация была медленной.
Сбор мусора стал намного быстрее.
Оптимизация горячих точек стала лучше.
Некоторые действительно старые JVM имели только зеленые потоки .

.
6
ответ дан 8 December 2019 в 18:37
поделиться

Современный JIT может агрессивно оптимизировать машинный код на основе профилирующей информации и другой информации, полученной из байтового кода:

  • Машинный код может быть сгенерирован с уровнем оптимизации, производным от ожидаемого использования (он WAS использовался много, возможно, будет использован еще больше). Это очень помогает!
  • Call to object.getFoo() может быть обработан таким образом, что содержимое метода помещается непосредственно в генерируемый код без вызова метода. Это может быть сделано рекурсивно, и может привести к тому, что сложный код будет заменен всего лишь несколькими реально выполненными инструкциями.
  • Сборка мусора значительно улучшилась. Это означает, что много времени не будет потрачено.
1
ответ дан 8 December 2019 в 18:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: