Home > Articles > Programming > Java

Java SE 8's New Compact Profiles and Integer APIs

  • Print
  • + Share This
  • 💬 Discuss
Like this article? We recommend
Java SE 8 offers many useful features that can increase your productivity. Lambdas, the Streams API, and Nashorn may be more widely known, but the Java SE 8 release also includes compact profiles, an API for unsigned integers, and an API for integer arithmetic overflow/underflow detection. Jeff Friesen introduces you to these three lesser-known features.

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.

  • + Share This
  • 🔖 Save To Your Account

Discussions

comments powered by Disqus