An Introduction to Java 8 Compact Profiles
By Jim Connors 16 October 2013
Java SE is a very impressive platform indeed, but with all that functionality comes a large and ever increasing footprint. It stands to reason then that one of the more frequent requests from the community has been the desire to deploy only those components required for a particular application instead of the entire Java SE runtime environment. Referred to as subsetting, the benefits of such a concept would seem to be many:
Despite these perceived advantages, the platform stewards (Sun, then Oracle) have been steadfast in their resistance to subsetting. The rationale for such a stance is quite simple: there was sincere concern that the Java SE platform would fragment. Agree or disagree, the Java SE standard has remained remarkably in tact over time. If you need any further evidence of this assertion, compare the state of Java SE to that of Java ME, particularly in the mobile telephony arena. Better still, look how quickly Android has spawned countless variants in its brief lifespan.
Nonetheless, a formal effort has been underway having the stated goal of providing a much more modular Java platform. Called Project Jigsaw, when complete, Java SE will be composed of a set of finer-grained modules and will include tools to enable developers to identify and isolate only those modules needed for their application. However, implementing this massive internal change and yet maintaining compatibility has proven to be a considerable challenge. Consequently full implementation of the modular Java platform has been delayed until Java 9.
Understanding that Java 9 is quite a ways off, an interim
solution will be available for Java 8, called Compact Profiles.
Rather than specifying a complete module system, Java 8 will
define subset profiles of the Java SE platform specification that
developers can use to deploy. At the current time three
compact profiles have been defined, and have been assigned the
creative names compact1, compact2, and compact3.
The table that follows lists the packages that comprise each of
the profiles. Each successive profile is a superset of its
predecessor. That is to say, the compact2 profile contains
all of the packages in compact1 plus those listed under the
compact2 column below. Likewise, compact3 contains all of
compact2 packages plus the ones listed in the compact3 column.
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
You may ask what savings can be realized by using compact profiles? As Java 8 is in pre-release stage, numbers will change over time, but let's take a look at a snapshot early access build of Java SE-Embedded 8 for ARMv5/Linux. A reasonably configured compact1 profile comes in at less than 14MB. Compact2 is about 18MB and compact3 is in the neighborhood of 21MB. For reference, the latest Java 7u21 SE Embedded ARMv5/Linux environment requires 45MB.
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.