Java SE 8's New Compact Profiles and Integer APIs
- Compact Profiles
- Unsigned Integer API
- Integer Arithmetic Overflow/Underflow Detection API
Java SE 8 brings many new and exciting features to Java developers. Lambdas, the Streams API, and the Nashorn JavaScript engine have gathered much of the attention, but this Java release also offers various small but important features that can make your life easier. This article introduces you to three of them: compact profiles, API support for unsigned integers, and API support for detecting overflows/underflows from integer arithmetic operations.
I developed this article's applications with the 64-bit version of JDK 8 build 132 on a Windows 7 platform. You can download the code from this article here.
Compact Profiles
Each Java SE release increases the size of Java's footprint, making it extremely difficult—if not impossible—to deploy the complete Java runtime on certain small devices. To address this problem, the Java community has requested that Java be subsetted, allowing you to deploy only those Java components required by an application, instead of deploying the entire runtime platform.
Subsetting offers several advantages:
- A smaller runtime platform can be optimized to start faster and perform better.
- Shrinking the runtime footprint increases the feasibility of bundling runtimes with individual applications.
- Fewer computational resources are required, making it possible to deploy Java on a wider variety of smaller devices.
Oracle has been reluctant to subset because subsetting fragments the Java platform, and fragmentation is a big problem for Android. Instead, Oracle is working to create a more modular Java platform through Project Jigsaw. However, because Project Jigsaw won't arrive until Java SE 9, Oracle has introduced compact profiles as an interim solution.
A compact profile is a collection of packages that are a subset of the Java platform. Java SE 8 defines three compact profiles, named compact1, compact2, and compact3. Each profile is a superset of its predecessor. For example, compact2 contains all of the compact1 packages as well as introducing its own packages. The following table identifies the packages introduced by each profile.
Table 1: Compact Profiles and Their Packages
Packages in compact1 |
Packages in compact2 |
Packages in compact3 |
java.io java.lang java.lang.annotation java.lang.invoke java.lang.ref java.lang.reflect java.math java.net java.nio java.nio.channels java.nio.channels.spi java.nio.charset java.nio.charset.spi java.nio.file java.nio.file.attribute java.nio.file.spi java.security java.security.cert java.security.interfaces java.security.spec java.text java.text.spi java.time java.time.chrono java.time.format java.time.temporal java.time.zone java.util java.util.concurrent java.util.concurrent.atomic java.util.concurrent.locks java.util.function java.util.jar java.util.logging java.util.regex java.util.spi java.util.stream java.util.zip javax.net javax.net.ssl javax.script javax.security.auth javax.security.auth.callback javax.security.auth.login javax.security.auth.spi javax.security.auth.x500 javax.security.cert |
java.rmi java.rmi.activation java.rmi.dgc java.rmi.registry java.rmi.server java.sql javax.rmi.ssl javax.sql javax.transaction javax.transaction.xa javax.xml javax.xml.datatype javax.xml.namespace javax.xml.parsers javax.xml.stream javax.xml.stream.events javax.xml.stream.util javax.xml.transform javax.xml.transform.dom javax.xml.transform.sax javax.xml.transform.stax javax.xml.transform.stream javax.xml.validation javax.xml.xpath org.w3c.dom org.w3c.dom.bootstrap org.w3c.dom.events org.w3c.dom.ls org.w3c.dom.views org.xml.sax org.xml.sax.ext org.xml.sax.helpers |
java.lang.instrument java.lang.management java.security.acl java.util.prefs javax.annotation.processing javax.lang.model javax.lang.model.element javax.lang.model.type javax.lang.model.util javax.management javax.management.loading javax.management.modelmbean javax.management.monitor javax.management.openmbean javax.management.relation javax.management.remote javax.management.remote.rmi javax.management.timer javax.naming javax.naming.directory javax.naming.event javax.naming.ldap javax.naming.spi javax.security.auth.kerberos javax.security.sasl javax.sql.rowset javax.sql.rowset.serial javax.sql.rowset.spi javax.tools javax.xml.crypto javax.xml.crypto.dom javax.xml.crypto.dsig javax.xml.crypto.dsig.dom javax.xml.crypto.dsig.keyinfo javax.xml.crypto.dsig.spec org.ietf.jgss |
The Java SE 8 javac compiler tool has a new -profile option that lets you compile an application's source code against one of the compact profiles. If the source code references a package not supported by the profile, javac outputs an error message. For example, consider the trivial class declaration in Listing 1.
Listing 1: CPDemo.java.
import java.sql.Statement; public class CPDemo { Statement stmt; }
You can easily compile this source code, which must be stored in a file named CPDemo.java, as follows:
javac CPDemo.java
Because the java.sql package is a member of the compact2 profile, which is a subset of compact3, either of the following commands will also compile Listing 1:
javac -profile compact2 CPDemo.java javac -profile compact3 CPDemo.java
However, if you attempt to compile Listing 1 against the compact1 profile, which doesn't support java.sql, you'll observe the following error messages:
CPDemo.java:1: error: Statement is not available in profile 'compact1' import java.sql.Statement; ^ CPDemo.java:5: error: Statement is not available in profile 'compact1' Statement stmt; ^ 2 errors
Java SE 8 also introduces the jdeps tool for listing the dependencies in a classfile, a directory of classfiles, or a JAR file of classfiles. For example, the following command executes jdeps against CPDemo.class:
jdeps CPDemo.class
This command generates the following output, which shows that CPDemo.class is dependent on the runtime JAR file, along with the java.lang and java.sql packages:
CPDemo.class -> C:\progra~1\java\jdk1.8.0\jre\lib\rt.jar <unnamed> (CPDemo.class) -> java.lang -> java.sql
You can obtain more information by specifying one or more options. For example, the following command also outputs the types in each referenced package and the profile to which the package belongs:
jdeps -verbose -P CPDemo.class
You should observe the following output (reformatted for readability):
CPDemo.class -> C:\progra~1\java\jdk1.8.0\jre\lib\rt.jar (compact2) CPDemo -> java.lang.Object compact1 CPDemo -> java.sql.Statement compact2
The -profile option and the jdeps tool help you ensure that your application conforms to a specific compact profile. Java SE 8 Embedded offers a jrecreate tool that lets you create a smaller Java platform (for ARM and other embedded devices) that conforms to this profile. Check out Jim Connors' "Demonstrating Compact Profiles" video to learn more.