Влад Борисов

Жалобы на низкую производительность Java-приложений стали уже традиционными. И вот Sun наконец частично решила эту проблему.

На конференции JESS’99 корпорация представила дополнение к виртуальной машине комплекта Java 2 - ускоритель HotSpot Performance Engine 1.0, позволяющий (согласно результатам теста SpecJVM98) почти вдвое увеличить скорость исполнения Java-программ. Фактически это расширение - адаптивный онлайновый компилятор из байт-кода Java в родной код платформы.

HotSpot серьезно отличается от ставших привычными оперативных (just-in-time) компиляторов. JIT-компиляторы транслируют в родной код каждый метод программы в момент первого обращения к нему. Но качественную компиляцию, с глубокой оптимизацией, в родной код они не осуществляют - на это требуется относительно много времени и такая оптимизация оказывается не всегда оправданной. Поэтому JIT-компиляторы просто ее не производят. Однако опыт показывает, что 80% времени при работе программ тратится на исполнение относительно небольшого числа методов. HotSpot занимается наблюдением за ходом исполнения программы, обнаруживает наиболее часто используемые куски байт-кода и транслирует их в родной код. Так как при этом необходима трансляция лишь небольшого объема программы, то ее можно осуществить очень качественно.

HotSpot также способен включать код одного метода в код другого, из которого первый вызывается. Это позволяет проводить дополнительную оптимизацию, в частности более эффективно использовать регистры процессора, устранять ненужные проверки выхода за границы массива и т. п. По ряду причин (например, из-за возможности переопределения виртуальных методов при динамической загрузке нового класса) JIT-компиляторы такую оптимизацию делать также не могут.

Еще одна особенность HotSpot - улучшенный метод управления памятью и сборки мусора. Напомним, что стандартная JVM производит очистку памяти от ненужных объектов, только когда этот ресурс практически исчерпан. При этом останавливается исполнение всех процессов, что делает JVM непригодной для систем реального времени. В HotSpot применен более сложный и продуктивный подход: ПО делит все объекты на две категории - короткоживущие и долгоживущие, размещая их в разных пулах памяти. Вновь созданный объект помещается в область короткоживущих объектов (как правило, 95% объектов оказываются именно такими), имеющую достаточно небольшой объем. Эта область часто проверяется на наличие в ней неиспользуемых объектов и дефрагментируется. Так как ее объект мал, то подобные операции не отнимают много ресурсов ЦП. Если какой-либо объект просуществовал достаточно долго, то он перемещается в область долгоживущих объектов, которая чистится и дефрагментируется гораздо реже. Имея большой объем, она содержит немного объектов, следовательно, ее чистка и дефрагментация также несильно нагружают ЦП. В итоге сборка мусора в HotSpot отнимает существенно меньше ресурсов ЦП, чем в обычной JVM, происходит регулярно, а память не перерасходуется - это очень важно для серверных задач и систем реального времени.

Еще одно отличие HotSpot - существенно переработанный механизм синхронизации потоков, позволяющий значительно снизить затраты ЦП на эту операцию.

Благодаря описанным усовершенствованиям, производительность механизма HotSpot оказывается вдвое выше, чем у стандартной JVM. По словам Алана Баратца, вице-президента Sun по Java-технологиям, корпорация рекомендует использовать HotSpot для исполнения серверных задач, для которых наиболее типично повторное исполнение одних и тех же кусков кода. На клиентских же местах, где все упирается в производительность графической подсистемы, применение этого ПО не даст ощутимых преимуществ.

HotSpot PE 1.0 можно бесплатно переписать с Web-узла Sun (java.sun.com/ products/hotspot/index.html) для платформ SPARC+Solaris и Windows. Летом должен появиться предварительный вариант версии 2.0, которая обеспечит дополнительное 30-процентное повышение производительности.

Версия для печати