Статьи

Введение в Java 8 Compact Profiles

Java SE действительно очень впечатляющая платформа, но со всей этой функциональностью все больше и больше. Тогда понятно, что одним из наиболее частых запросов сообщества было желание развернуть только те компоненты, которые требуются для конкретного приложения, а не всю среду выполнения Java SE. Упомянутые как подмножества, преимущества такой концепции, по-видимому, много:

  • Меньшая среда Java потребует меньше вычислительных ресурсов, открывая, таким образом, новый домен устройств, которые ранее считались слишком скромными для Java.
  • Среда выполнения меньшего размера могла бы быть лучше оптимизирована для производительности и времени запуска.
  • Исключение неиспользуемого кода всегда хорошая идея с точки зрения безопасности.
  • Если среда может быть значительно сокращена, может быть огромное преимущество в объединении сред выполнения с каждым отдельным приложением Java.
  • Эти связанные приложения могут быть загружены быстрее.

Несмотря на эти очевидные преимущества, стюарды платформы (Sun, затем Oracle) были стойкими в своем сопротивлении подмножеству. Обоснование такой позиции довольно простое: была искренняя обеспокоенность тем, что платформа Java SE будет фрагментирована. Согласитесь или не согласитесь, стандарт Java SE оставался замечательно в такте в течение долгого времени. Если вам нужны дальнейшие доказательства этого утверждения, сравните состояние Java SE с состоянием Java ME, особенно в области мобильной телефонии. Более того, посмотрите, как быстро Android породил бесчисленные варианты за свою короткую жизнь.

Тем не менее, предпринимаются официальные усилия, направленные на создание гораздо более модульной платформы Java. Названный  Project Jigsaw , когда он будет завершен, Java SE будет состоять из набора более мелких модулей и будет включать инструменты, позволяющие разработчикам идентифицировать и изолировать только те модули, которые необходимы для их приложения. Однако реализация этого масштабного внутреннего изменения и в то же время поддержание совместимости оказалась серьезной проблемой. Следовательно,  полная реализация модульной платформы Java была отложена до Java 9 .

Понимая, что Java 9 довольно далека, будет доступно временное решение для Java 8, которое называется  Compact Profiles . Вместо того, чтобы указывать полную модульную систему, Java 8 будет определять профили подмножеств спецификации платформы Java SE, которые разработчики могут использовать для развертывания. В настоящее время определены три компактных профиля, которым присвоены креативные имена  compact1compact2 и  compact3., В следующей таблице перечислены пакеты, которые составляют каждый из профилей. Каждый последующий профиль является надмножеством своего предшественника. То есть профиль compact2 содержит все пакеты в compact1 плюс те, которые перечислены в столбце compact2 ниже. Аналогично, compact3 содержит все пакеты compact2, а также пакеты, перечисленные в столбце compact3.

compact1                     compact2                    compact3
--------------------------   -----------------------     --------------------------
java.io                      java.rmi                    java.lang.instrument
java.lang                    java.rmi.activation         java.lang.management
java.lang.annotation         java.rmi.registry           java.security.acl
java.lang.invoke             java.rmi.server             java.util.prefs
java.lang.ref                java.sql                    javax.annotation.processing
java.lang.reflect            javax.rmi.ssl               javax.lang.model
java.math                    javax.sql                   javax.lang.model.element
java.net                     javax.transaction           javax.lang.model.type
java.nio                     javax.transaction.xa        javax.lang.model.util
java.nio.channels            javax.xml                   javax.management
java.nio.channels.spi        javax.xml.datatype          javax.management.loading
java.nio.charset             javax.xml.namespace         javax.management.modelbean
java.nio.charset.spi         javax.xml.parsers           javax.management.monitor
java.nio.file                javax.xml.stream            javax.management.openmbean
java.nio.file.attribute      javax.xml.stream.events     javax.management.relation
java.nio.file.spi            javax.xml.stream.util       javax.management.remote
java.security                javax.xml.transform         javax.management.remote.rmi
java.security.cert           javax.xml.transform.dom     javax.management.timer
java.security.interfaces     javax.xml.transform.sax     javax.naming
java.security.spec           javax.xml.transform.stax    javax.naming.directory
java.text                    javax.xml.transform.stream  javax.naming.event
java.text.spi                javax.xml.validation        javax.naming.ldap
java.util                    javax.xml.xpath             javax.naming.spi
java.util.concurrent         org.w3c.dom                 javax.script
java.util.concurrent.atomic  org.w3c.dom.bootstrap       javax.security.auth.kerberos
java.util.concurrent.locks   org.w3c.dom.events          javax.security.sasl
java.util.jar                org.w3c.dom.ls              javax.sql.rowset
java.util.logging            org.xml.sax                 javax.sql.rowset.serial
java.util.regex              org.xml.sax.ext             javax.sql.rowset.spi
java.util.spi                org.xml.sax.helpers         javax.tools
java.util.zip                                            javax.xml.crypto
javax.crypto                                             javax.xml.crypto.dom
javax.crypto.interfaces                                  javax.xml.crypto.dsig
javax.crypto.spec                                        javax.xml.crypto.dsig.dom
javax.net                                                javax.xml.crypto.dsig.keyinfo
javax.net.ssl                                            javax.xml.crypto.dsig.spec
javax.security.auth                                      org.ieft.jgss
javax.security.auth.callback
javax.security.auth.login
javax.security.auth.spi
javax.security.auth.x500
javax.security.cert

Вы можете спросить, какую экономию можно получить, используя компактные профили? Поскольку Java 8 находится на стадии подготовки к выпуску, числа со временем меняются, но давайте взглянем на снимок ранней сборки доступа SE SE-Embedded 8 для ARMv5 / Linux. Разумно настроенный профиль compact1 занимает менее 14 МБ . Compact2 — около 18 МБ, а compact3 — около 21 МБ. Для справки: последняя среда Java 7u21 SE Embedded ARMv5 / Linux требует 45 МБ.

So at less than one-third the original size of the already space-optimized Java SE-Embedded release, you have a very capable runtime environment.  If you need the additional functionality provided by the compact2 and compact3 profiles or even the full VM, you have the option of deploying your application with them instead.

In the next installment, we’ll look at Compact Profiles in a bit more detail.