IBM SDK for Linux platforms, Java Technology Edition

SDK and Runtime Guide

Version 6

Copyright International Business Machines Corporation 2003, 2008.
US Government Users Restricted Rights -- Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.

Contents

Preface
Overview
Conventions
Version compatibility
Migrating from other IBM JVMs
Supported hardware for System z
Contents of the SDK and Runtime Environment
Contents of the Runtime Environment
Contents of the SDK
Installing and configuring the SDK and Runtime Environment
Upgrading the SDK
Installing on Red Hat Enterprise Linux (RHEL) 4
Installing on Red Hat Enterprise Linux (RHEL) 5
Running Java with SELinux on RHEL 5
Installing a 32-bit SDK on 64-bit architecture
Installing from an RPM file
Installing from a .tgz file
Using a JPackage compatible format
Configuring the SDK and Runtime Environment for Linux
Setting the path
Setting the class path
Uninstalling the SDK and Runtime Environment for Linux
Uninstalling the Red Hat Package Manager (RPM) package
Uninstalling the compressed Tape Archive (TAR) package
Running Java applications
The java and javaw commands
Obtaining version information
Specifying Java options and system properties
Standard options
Globalization of the java command
The Just-In-Time (JIT) compiler
Disabling the JIT
Enabling the JIT
Determining whether the JIT is enabled
Specifying garbage collection policy
Garbage collection options
More effective heap usage using compressed references
Pause time
Pause time reduction
Environments with very full heaps
Euro symbol support
Fallback font configuration files
Using Indian and Thai input methods
Developing Java applications
Using XML
Migrating to the XL-TXE-J
XML reference information
Debugging Java applications
Java Debugger (JDB)
Selective debugging
Determining whether your application is running on a 32-bit or 64-bit JVM
How the JVM processes signals
Signals used by the JVM
Linking a native code driver to the signal-chaining library
Writing JNI applications
Support for thread-level recovery of blocked connectors
Configuring large page memory allocation
CORBA support
System properties for tracing the ORB
System properties for tuning the ORB
Java security permissions for the ORB
ORB implementation classes
RMI over IIOP
Implementing the Connection Handler Pool for RMI
Enhanced BigDecimal
Support for XToolkit
Plug-in, Applet Viewer and Web Start
(Linux IA 32-bit and PPC32 only) Using the Java plug-in
Supported browsers
Installing the Java plug-in
Common Document Object Model (DOM) support
Using DBCS parameters
Working with applets
Running and debugging applets with the Applet Viewer
(Linux IA 32-bit, PPC32, and PPC64 only) Using Web Start
Running Web Start
(Linux IA 32-bit only) WebStart Secure Static Versioning
Distributing Java applications
Class data sharing between JVMs
Overview of class data sharing
Class data sharing command-line options
Creating, populating, monitoring, and deleting a cache
Performance and memory consumption
Considerations and limitations of using class data sharing
Cache size limits
Runtime bytecode modification
Operating system limitations
Using SharedClassPermission
Adapting custom classloaders to share classes
Java Communications API (JavaComm)
Installing Java Communications API from a compressed file
Installing the Java Communications API from an RPM file
Location of the Java Communications API files
Configuring the Java Communications API
Changing the access mode of serial and parallel ports
Specifying devices in the javax.comm.properties file
Enabling serial ports on IBM ThinkPads
Printing limitation with the Java Communications API
Uninstalling Java Communications API
Uninstalling the Red Hat Package Manager (RPM) package
Uninstalling the compressed Tape Archive (TAR) package
The Java Communications API documentation
Service and support for independent software vendors
Accessibility
Keyboard traversal of JComboBox components in Swing
Web Start accessibility (Linux IA 32-bit, PPC32, and PPC64 only)
Any comments on this user guide?
Appendix A. Nonstandard options
Appendix B. Known limitations
Notices
Trademarks

Preface

This user guide provides general information about the IBM® SDK and Runtime Environment for Linux® platforms, Java™ Technology Edition, Version 6 and specific information about any differences in the IBM implementation compared with the Sun implementation.

Read this user guide in conjunction with the more extensive documentation on the Sun Web site: http://java.sun.com.

For the list of distributions against which the SDK and Runtime Environment for Linux have been tested, see: http://www.ibm.com/developerworks/java/jdk/linux/tested.html.

(Intel® 32-bit platforms only) These Virtualized Environments are supported:

The Diagnostics Guide provides more detailed information about the IBM Virtual Machine for Java.

This user guide is part of a release and is applicable only to that particular release. Make sure that you have the user guide appropriate to the release you are using.

The terms "Runtime Environment" and "Java Virtual Machine" are used interchangeably throughout this user guide.

|Technical changes made for this version |of the user guide, other than minor or obvious ones, are indicated |by blue chevrons when viewing in an Information Center, in red with |vertical bars to the left of the changes when viewing in HTML or in |a color-printed copy, or by vertical bars to the left of the changes |when viewing as a PDF.

The Program Code is not designed or intended for use in real-time applications such as (but not limited to) the online control of aircraft, air traffic, aircraft navigation, or aircraft communications; or in the design, construction, operation, or maintenance of any nuclear facility.

Overview

The IBM SDK is a development environment for writing and running applets and applications that conform to the Java 6 Core Application Program Interface (API).

The SDK includes the Runtime Environment for Linux, which enables you only to run Java applications. If you have installed the SDK, the Runtime Environment is included.

The Runtime Environment contains the Java Virtual Machine and supporting files including non-debuggable .so files and class files. The Runtime Environment contains only a subset of the classes that are found in the SDK and allows you to support a Java program at runtime but does not provide compilation of Java programs. The Runtime Environment for Linux does not include any of the development tools, for example appletviewer or the Java compiler (javac), or classes that are only for development systems.

In addition, for IA32, PPC32/PPC64, and AMD64/EM64T platforms, the Java Communications application programming interface (API) package is provided for use with the Runtime Environment for Linux. You can find information about it in Java Communications API (JavaComm).

The license_xx.html file contains the license agreement for the Runtime Environment for Linux software, where xx is an abbreviation for the language. To view or print the license agreement, open the file in a Web browser.

Conventions

Throughout this user guide the default installation directory of the SDK is referred to as /opt/ibm/java-<arch>-60/, where <arch> is the architecture of your platform.

The default installation directories for the various architectures are listed here; replace the directory for the architecture you are using when you see /opt/ibm/java-<arch>-60/:

Korn shell commands are used in examples throughout this user guide.

Version compatibility

In general, any applet or application that ran with a previous version of the SDK should run correctly with the IBM SDK for Linux, v6. Classes compiled with this release are not guaranteed to work on previous releases.

For information about compatibility issues between releases, see the Sun web site at:

http://java.sun.com/javase/6/webnotes/compatibility.html

http://java.sun.com/j2se/5.0/compatibility.html

http://java.sun.com/j2se/1.4/compatibility.html

http://java.sun.com/j2se/1.3/compatibility.html

If you are using the SDK as part of another product (for example, IBM WebSphere® Application Server), and you upgrade from a previous level of the SDK, perhaps v5.0, serialized classes might not be compatible. However, classes are compatible between service refreshes.

Migrating from other IBM JVMs

From Version 5.0, the IBM Runtime Environment for Linux contains new versions of the IBM Virtual Machine for Java and the Just-In-Time (JIT) compiler.

If you are migrating from an older IBM Runtime Environment, note that:

Supported hardware for System z

The System z 31-bit and 64-bit SDKs and Runtime Environments run on System z9® and zSeries® hardware.

The SDKs and Runtime Environments run on the following servers or equivalents:

Contents of the SDK and Runtime Environment

The SDK contains several development tools and a Java Runtime Environment (JRE). This section describes the contents of the SDK tools and the Runtime Environment.

Applications written entirely in Java must have no dependencies on the IBM SDK's directory structure (or files in those directories). Any dependency on the SDK's directory structure (or the files in those directories) might result in application portability problems.

The user guides, Javadoc, and the accompanying license, copyright files, javadoc, and demo directory are the only documentation included in this SDK for Linux. You can view Sun's software documentation by visiting the Sun Web site, or you can download Sun's software documentation package from the Sun Web site: http://java.sun.com.

Contents of the Runtime Environment

A list of classes, tools, and other files that you can use with the standard Runtime Environment.

Contents of the SDK

A list of tools and reference information that is included with the standard SDK.

The following tools are part of the SDK and are located in the /opt/ibm/java-<arch>-60/bin directory:
appletviewer (Java Applet Viewer)
Tests and runs applets outside a Web browser.
apt (Annotation Processing Tool)
Finds and executes annotation processors based on the annotations present in the set of specified source files being examined.
ControlPanel (Java Control Panel)
(Except System z platforms) Configures your Runtime Environment.
extcheck (Extcheck utility)
Detects version conflicts between a target jar file and currently-installed extension jar files.
(Linux IA 32-bit and PPC32) HtmlConverter (Java Plug-in HTML Converter)
Converts an HTML page that contains applets to a format that can use the Java Plug-in.
idlj (IDL to Java Compiler)
Generates Java bindings from a given IDL file.
ikeycmd (iKeyman command-line utility)
Allows you to manage keys, certificates, and certificate requests from the command line. For more information see the accompanying Security Guide and http://www.ibm.com/developerworks/java/jdk/security/.
jar (Java Archive Tool)
Combines multiple files into a single Java Archive (JAR) file.
jarsigner (JAR Signing and Verification Tool)
Generates signatures for JAR files and verifies the signatures of signed JAR files.
java (Java Interpreter)
Runs Java classes. The Java Interpreter runs programs that are written in the Java programming language.
java-rmi.cgi (HTTP-to-CGI request forward tool)
Accepts RMI-over-HTTP requests and forwards them to an RMI server listening on any port.
javac (Java Compiler)
Compiles programs that are written in the Java programming language into bytecodes (compiled Java code).
javadoc (Java Documentation Generator)
Generates HTML pages of API documentation from Java source files.
javah (C Header and Stub File Generator)
Enables you to associate native methods with code written in the Java programming language.
javap (Class File Disassembler)
Disassembles compiled files and can print a representation of the bytecodes.
javaw (Java Interpreter)
Runs Java classes in the same way as the java command does, but does not use a console window.
(Linux IA 32-bit, PPC32, and PPC64 only) javaws (Java Web Start)
Enables the deployment and automatic maintenance of Java applications. For more information, see Running Web Start.
jconsole (JConsole Monitoring and Management Tool)
Monitors local and remote JVMs using a GUI. JMX-compliant.
jdb (Java Debugger)
Helps debug your Java programs.
jdmpview (Cross-platform dump formatter)
Analyzes dumps. For more information, see the Diagnostics Guide.
keytool (Key and Certificate Management Tool)
Manages a keystore (database) of private keys and their associated X.509 certificate chains that authenticate the corresponding public keys.
native2ascii (Native-To-ASCII Converter)
Converts a native encoding file to an ASCII file that contains characters encoded in either Latin-1 or Unicode, or both.
policytool (Policy File Creation and Management Tool)
Creates and modifies the external policy configuration files that define your installation's Java security policy.
rmic (Java Remote Method Invocation (RMI) Stub Converter)
Generates stubs, skeletons, and ties for remote objects. Includes RMI over Internet Inter-ORB Protocol (RMI-IIOP) support.
rmid (RMI activation system daemon)
Starts the activation system daemon so that objects can be registered and activated in a Java virtual machine (JVM).
rmiregistry (Java remote object registry)
Creates and starts a remote object registry on the specified port of the current host.
schemagen
Creates a schema file for each namespace referenced in your Java classes.
serialver (Serial Version Command)
Returns the serialVersionUID for one or more classes in a format that is suitable for copying into an evolving class.
tnameserv (Common Object Request Broker Architecture (CORBA) transient naming service)
Starts the CORBA transient naming service.
wsgen
Generates JAX-WS portable artifacts used in JAX-WS web services.
wsimport
Generates JAX-WS portable artifacts from a WSDL file.
xjc
Compiles XML Schema files.
Include Files
C headers for JNI programs.
Demos
The demo directory contains a number of subdirectories containing sample source code, demos, applications, and applets that you can use. From Version 6, the RMI-IIOP demo is not included with the SDK.
copyright
The copyright notice for the SDK for Linux software.
License

The License file, /opt/ibm/java-<arch>-60/docs/content/<locale>/LA_<locale>, contains the license agreement for the SDK for Linux software (where <locale> is the name of your locale, for example en). To view or print the license agreement, open the file in a Web browser.

Installing and configuring the SDK and Runtime Environment

You can install the IBM Java SDK and Runtime Environment from either an RPM or a .tgz file. Unless you want to allow all the users on the machine to access this Java installation, use the .tgz installation method. If you do not have root access, use the .tgz file.

If you install using an RPM file, the Java files are installed in /opt/ibm/java-<arch>-60/. The examples in this guide assume that you have installed Java in this directory.

Upgrading the SDK

If you are upgrading the SDK from a previous release, back up all the configuration files and security policy files before you start the upgrade.

What to do next

After the upgrade, you might have to restore or reconfigure these files because they might have been overwritten during the upgrade process. Check the syntax of the new files before restoring the original files because the format or options for the files might have changed.

Installing on Red Hat Enterprise Linux (RHEL) 4

The SDK depends on shared libraries that are not installed by default for Red Hat Enterprise Linux (RHEL).

About this task

In RHEL 4, the RPMs that contain these libraries are:

To include these libraries during RHEL 4 installation:

  1. When you reach the Package Defaults screen, select Customize the set of packages to be installed.
  2. At the Package Group Selection screen, under X Windows System, choose Details and make sure that you have selected xorg-x11-deprecated-libs
  3. Under the Development options, select Legacy Software Development.

Installing on Red Hat Enterprise Linux (RHEL) 5

The SDK depends on shared libraries that are not installed by default for Red Hat Enterprise Linux (RHEL).

About this task

In RHEL 5, these RPMs contain the shared libraries:

To include these libraries during RHEL 5 installation:

  1. At the software selection screen, select Customize now.
  2. On the next screen, in the left panel, select Base System; in the right panel, select Legacy Software Support. These selections install the compat-libstdc++ packages.

Running Java with SELinux on RHEL 5

You can run the IBM SDK for Java on Red Hat Enterprise Linux Version 5 with SELinux enabled on all platforms except PPC without any restrictions. For PPC platforms, Java must be installed in the default directory or you must enable it manually.

About this task

To enable Java manually on PPC platforms, enter this command:

chcon -R -t texrel_shlib_t <path_of_sdk>

Where <path_of_sdk> is the path where Java is installed.

For more information about SELinux, see Introduction to SELinux in the Red Hat documentation.

Installing a 32-bit SDK on 64-bit architecture

To run the SDK, you must install the correct versions of all libraries required by the SDK, either 32- or 64-bit.

About this task

In RHEL4, the 64-bit versions of the packages are available in the Compatibility Arch Support package group.

You can use the RPM tool to check which versions of the packages you have installed by adding the option --queryformat "%{NAME}.%{ARCH}\n" to your RPM command. For example:

/home/username : rpm --queryformat "%{NAME}.%{ARCH}\n" -q libstdc++
libstdc++.x86_64
libstdc++.i386

Installing from an RPM file

A procedure for installing from an RPM file.

About this task

To upgrade your JVM using the rpm tool, you must uninstall any previous version. To install two versions of the JVM in different locations, use the rpm --force option to ignore the version conflict or install the JVM from the .tgz file.

  1. Open a shell prompt, making sure you are root.
  2. At a shell prompt, type rpm -ivh <RPM file>. For example:
    rpm -ivh ibm-java-<arch>-sdk-6.0-3.0.<arch>.rpm
    or
    rpm -ivh ibm-java-<arch>-jre-6.0-3.0.<arch>.rpm

    Where <arch> represents your architecture: i386, x86_64, ppc, ppc64, s390, or s390x.

Installing from a .tgz file

A procedure for installing from a .tgz file.

  1. Create a directory to store the Java package files. The examples in this guide assume that you have installed in /opt/ibm/java-<arch>-60/. In the rest of the guide, replace /opt/ibm/java-<arch>-60/ with the directory in which you installed Java.
  2. At a shell prompt, type tar -zxvf <.tgz file>.
    tar -zxvf ibm-java-sdk-6.0-3.0-linux-<arch>.tgz
    or
    tar -zxvf ibm-java-jre-6.0-3.0-linux-<arch>.tgz

    Where <arch> represents your architecture: i386, x86_64, ppc, ppc64, s390, or s390x.

  3. If you are running Security-Enhanced Linux (SELinux), you must identify the Java shared libraries to the system. Type:
    chcon -R -t texrel_shlib_t /opt/ibm/java-<arch>-60/jre
    chcon -R -t texrel_shlib_t /opt/ibm/java-<arch>-60/bin
    chcon -R -t texrel_shlib_t /opt/ibm/java-<arch>-60/lib

Using a JPackage compatible format

The IBM SDK for Linux, v6 is also available in a JPackage compatible format.

Before you begin

To simplify managing the SDK, the various components of it are now available as separate RPMs: the base Java Runtime Environment, Development Kit, Plug-in, JDBC, Demo, Sound, Source, and Fonts. "jpackage-utils" RPM (downloadable from http://jpackage.org), which allows managing multiple Java RPMs on a system, is a prerequisite for the IBM SDKs. For more information about the JPackage specification, see http://jpackage.org.

If you install the SDK using JPackage, it will not be installed in the default location. See the "Directory Structure" section of the JPackage Java™ infrastructure design and packaging policy for details about the default JPackage installation location: http://www.jpackage.org/cgi-bin/viewvc.cgi/src/jpackage-utils/doc/jpackage-1.5-policy.xhtml?root=jpackage&view=co

jpackage-utils version 1.5.38 or above is required to install the IBM SDK for Linux, v6.

JPackage is not supported on SLES9 or SLES10 platforms.

Configuring the SDK and Runtime Environment for Linux

Inconsistencies in the font encodings on Red Hat Advanced Server

Note: (For Linux IA 32-bit Chinese users only) Because of inconsistencies in the font encodings on Red Hat Advanced Server, when you install for an environment in which you want Chinese to be the default language, it is better to install with a default language of English and then change to Chinese after the installation is complete. Otherwise, you might find that the Chinese fonts do not display.

Setting the path

If you alter the PATH environment variable, you will override any existing Java launchers in your path.

About this task

The PATH environment variable enables Linux to find programs and utilities, such as javac, java, and javadoc, from any current directory. To display the current value of your PATH, type the following at a command prompt:

echo $PATH

To add the Java launchers to your path:

  1. Edit the shell startup file in your home directory (typically .bashrc, depending on your shell) and add the absolute paths to the PATH environment variable; for example:
    export PATH=/opt/ibm/java-<arch>-60/bin:/opt/ibm/java-<arch>-60/jre/bin:$PATH
  2. Log on again or run the updated shell script to activate the new PATH environment variable.

Results

After setting the path, you can run a tool by typing its name at a command prompt from any directory. For example, to compile the file Myfile.Java, at a command prompt, type:

javac Myfile.Java

Setting the class path

The class path tells the SDK tools, such as java, javac, and javadoc, where to find the Java class libraries.

About this task

You need to set the class path explicitly only if:

To display the current value of your CLASSPATH environment variable, type the following command at a shell prompt:

  echo $CLASSPATH

If you develop and run applications that use different runtime environments, including other versions that you have installed separately, you must set the CLASSPATH and PATH explicitly for each application. If you run multiple applications simultaneously and use different runtime environments, each application must run in its own shell prompt.

Uninstalling the SDK and Runtime Environment for Linux

The process that you use to remove the SDK and Runtime Environment for Linux depends on what type of installation you used.

See Uninstalling the Red Hat Package Manager (RPM) package or Uninstalling the compressed Tape Archive (TAR) package for instructions.

Uninstalling the Red Hat Package Manager (RPM) package

A procedure for uninstalling the Red Hat Package Manager (RPM) package.

About this task

To uninstall the SDK or Runtime Environment for Linux if you installed the installable RPM package:

  1. To check which RPM packages you have installed, enter: rpm -qa | grep -i java

    You will see a list of any IBM Java packages that you have installed; for example:

    ibm-java-<arch>-jre-6.0-3.0.<arch>
    ibm-java-<arch>-sdk-6.0-3.0.<arch>

    This output tells you which packages you can uninstall, using the rpm -e command; for example:

    rpm -e ibm-java-<arch>-jre-6.0-3.0.<arch>
    rpm -e ibm-java-<arch>-sdk-6.0-3.0.<arch>

    Alternatively, you can use a graphical tool such as kpackage or yast2

  2. Remove from your PATH statement the directory in which you installed the SDK and Runtime Environment.
  3. (Linux IA 32-bit and PPC32 only) If you installed the Java Plug-in, remove the Java Plug-in files from the web browser directory.

Uninstalling the compressed Tape Archive (TAR) package

A list of the steps to remove the IBM SDK for Linux, v6 that was extracted from the compressed package.

  1. Remove the SDK or Runtime Environment files from the directory in which you installed the SDK or Runtime Environment.
  2. Remove from your PATH statement the directory in which you installed the SDK or Runtime Environment.
  3. Log on again or run the updated shell script to activate the new PATH setting.
  4. (Linux IA 32-bit and PPC32 only) If you installed the Java Plug-in, remove the Java Plug-in files from the web browser directory.

Running Java applications

Java applications can be started using the java launcher or through JNI. Settings are passed to a Java application using command-line arguments, environment variables, and properties files.

The java and javaw commands

An overview of the java and javaw commands.

Purpose

The java and javaw tools launch a Java application by starting a Java Runtime Environment and loading a specified class.

The javaw command is identical to java, except that javaw has no associated console window. Use javaw when you do not want a command prompt window to be displayed. The javaw launcher displays a dialog box with error information if a launch fails.

Usage

The JVM searches for the initial class (and other classes that are used) in three sets of locations: the bootstrap class path, the installed extensions, and the user class path. The arguments that you specify after the class name or jar file name are passed to the main function.

The java and javaw commands have the following syntax:

java [ options ] <class> [ arguments ... ]
java [ options ] -jar <file.jar> [ arguments ... ]
javaw [ options ] <class> [ arguments ... ]
javaw [ options ] -jar <file.jar> [ arguments ... ]

Parameters

[options]
Command-line options to be passed to the runtime environment.
<class>
Startup class. The class must contain a main() method.
<file.jar>
Name of the jar file to invoke. It is used only with the -jar option. The named jar file must contain class and resource files for the application, with the startup class indicated by the Main-Class manifest header.
[arguments ...]
Command-line arguments to be passed to the main() function of the startup class.

Obtaining version information

You obtain The IBM build and version number for your Java installation using the -version option. You can also obtain version information for all jar files on the class path by using the -Xjarversion option.

  1. Open a shell prompt.
  2. Type the following command:
    java -version
    You will see information similar to:
    java version "1.6.0-internal"
    Java(TM) SE Runtime Environment (build 20070329_01)
    IBM J9 VM (build 2.4, J2RE 1.6.0 IBM J9 2.4 Linux x86-32 jvmxi3260-20070326_12091 (JIT enabled)
    J9VM - 20070326_12091_lHdSMR
    JIT  - dev_20070326_1800
    GC   - 20070319_AA)
    Exact build dates and versions will change.

What to do next

You can also list the version information for all available jar files on the class path, the boot class path, and in the extensions directory. Type the following command:

java -Xjarversion

You will see information similar to:

...
/opt/ibm/java-<arch>-60/jre/lib/ext/ibmpkcs11impl.jar  VERSION: 1.0 build_20070125
/opt/ibm/java-<arch>-60/jre/lib/ext/dtfjview.jar
/opt/ibm/java-<arch>-60/jre/lib/ext/xmlencfw.jar  VERSION: 1.00, 20061011  LEVEL: -20061011

...

The information available varies for each jar file and is taken from the Implementation-Version and Build-Level properties in the manifest of the jar file.

Specifying Java options and system properties

You can specify Java options and system properties on the command line, by using an options file, or by using an environment variable.

About this task

These methods of specifying Java options are listed in order of precedence. Rightmost options on the command line have precedence over leftmost options; for example, if you specify:

java -Xint -Xjit myClass

The -Xjit option takes precedence.

  1. By specifying the option or property on the command line. For example:
    java -Dmysysprop1=tcpip -Dmysysprop2=wait -Xdisablejavadump MyJavaClass
  2. By creating a file that contains the options, and specifying it on the command line using -Xoptionsfile=<file>.
  3. By creating an environment variable called IBM_JAVA_OPTIONS containing the options. For example:
    export IBM_JAVA_OPTIONS="-Dmysysprop1=tcpip -Dmysysprop2=wait -Xdisablejavadump"

Standard options

The definitions for the standard options.

See Appendix A. Nonstandard options for information about nonstandard (-X) options.

-agentlib:<libname>[=<options>]
Loads a native agent library <libname>; for example -agentlib:hprof. For more information, specify -agentlib:jdwp=help and -agentlib:hprof=help on the command line.
-agentpath:libname[=<options>]
Loads a native agent library by full path name.
-cp <directories and zip or jar files separated by :>
Sets the search path for application classes and resources. If -classpath and -cp are not used and the CLASSPATH environment variable is not set, the user class path is, by default, the current directory (.).
-classpath <directories and zip or jar files separated by :>
Sets the search path for application classes and resources. If -classpath and -cp are not used and the CLASSPATH environment variable is not set, the user class path is, by default, the current directory (.).
-D<property name>=<value>
Sets a system property.
-help or -?
Prints a usage message.
-javaagent:<jarpath>[=<options>]
Load a Java programming language agent. For more information, see the java.lang.instrument API documentation.
-jre-restrict-search
Include user private JREs in the version search.
-no-jre-restrict-search
Exclude user private JREs in the version search.
-showversion
Prints product version and continues.
-verbose:<option>[,<option>...]
Enables verbose output. Separate multiple options using commas. The available options are:
class
Writes an entry to stderr for each class that is loaded.
gc
Writes verbose garbage collection information to stderr. Use -Xverbosegclog to control the output. See the Diagnostics Guide for more information.
jni
Writes information to stderr describing the JNI services called by the application and JVM.
sizes
Writes information to stderr describing the active memory usage settings.
stack
Writes information to stderr describing the Java and C stack usage for each thread.
-version
Prints product version.
-version:<value>
Requires the specified version to run, for example "1.5".
-X
Prints help on nonstandard options.

Globalization of the java command

The java and javaw launchers accept arguments and class names containing any character that is in the character set of the current locale. You can also specify any Unicode character in the class name and arguments by using Java escape sequences.

To do this, use the -Xargencoding command-line option.

-Xargencoding
Use argument encoding. To specify a Unicode character, use escape sequences in the form \u####, where # is a hexadecimal digit (0 to 9, A to F).
-Xargencoding:utf8
Use UTF8 encoding.
-Xargencoding:latin
Use ISO8859_1 encoding.

For example, to specify a class called HelloWorld using Unicode encoding for both capital letters, use this command:

java -Xargencoding '\u0048ello\u0057orld'

The java and javaw commands provide translated messages. These messages differ based on the locale in which Java is running. The detailed error descriptions and other debug information that is returned by java is in English.

The Just-In-Time (JIT) compiler

The IBM Just-In-Time (JIT) compiler dynamically generates machine code for frequently used bytecode sequences in Java applications and applets during their execution. The JIT v6 compiler delivers new optimizations as a result of compiler research, improves optimizations implemented in previous versions of the JIT, and provides better hardware exploitation.

Both the IBM SDK and Runtime Environment include the JIT, which is enabled by default in user applications and SDK tools. Normally, you do not invoke the JIT explicitly; the compilation of Java bytecode to machine code occurs transparently. You can disable the JIT to help isolate a problem. If a problem occurs when executing a Java application or an applet, you can disable the JIT to help isolate the problem. Disabling the JIT is a temporary measure only; the JIT is required to optimize performance.

For more information about the JIT, see the Diagnostics Guide.

Disabling the JIT

The JIT can be disabled in a number of different ways. Both command-line options override the JAVA_COMPILER environment variable.

About this task

Turning off the JIT is a temporary measure that can help isolate problems when debugging Java applications.

Enabling the JIT

The JIT is enabled by default. You can explicitly enable the JIT in a number of different ways. Both command-line options override the JAVA_COMPILER environment variable.

Determining whether the JIT is enabled

You can determine the status of the JIT using the -version option.

Run the java launcher with the -version option. Enter the following at a shell prompt:

java -version


If the JIT is not in use, a message is displayed that includes the following:

(JIT disabled)

If the JIT is in use, a message is displayed that includes the following:

(JIT enabled)

What to do next

For more information about the JIT, see the Diagnostics Guide.

Specifying garbage collection policy

The Garbage Collector manages the memory used by Java and by applications running within the JVM.

When the Garbage Collector receives a request for storage, unused memory in the heap is set aside in a process called "allocation". The Garbage Collector also checks for areas of memory that are no longer referenced, and releases them for reuse. This is known as "collection".

The collection phase can be triggered by a memory allocation fault, which occurs when no space is left for a storage request, or by an explicit System.gc() call.

Garbage collection can significantly affect application performance, so the IBM virtual machine provides various methods of optimizing the way garbage collection is carried out, potentially reducing the effect on your application.

For more detailed information about garbage collection, see the Diagnostics Guide.

Garbage collection options

The -Xgcpolicy options control the behavior of the Garbage Collector. They make trade-offs between throughput of the application and overall system, and the pause times that are caused by garbage collection.

The format of the option and its values is:

-Xgcpolicy:optthruput
(Default and recommended value.) Delivers very high throughput to applications, but at the cost of occasional pauses.
-Xgcpolicy:optavgpause
Reduces the time spent in garbage collection pauses and limits the effect of increasing heap size on the length of the garbage collection pause. Use optavgpause if your configuration has a very large heap.
-Xgcpolicy:gencon
Requests the combined use of concurrent and generational GC to help minimize the time that is spent in any garbage collection pause.
-Xgcpolicy:subpool
(PPC and zSeries only.) Uses an improved object allocation algorithm to achieve better performance when allocating objects on the heap. This option might improve performance on large SMP systems.

More effective heap usage using compressed references

Many Java application workloads depend on the Java heap size. The IBM SDK for Java can use compressed references on 64-bit platforms to decrease the size of Java objects and make more effective use of the available space.

The IBM SDK for Java 64-bit stores object references as 64-bit values. When the same application is run on a 32-bit JVM and a 64-bit JVM, the 64-bit JVM requires a larger heap because the references in the Java objects are larger. The -Xcompressedrefs command-line option causes object references to be stored as 32-bit values and maintains the 32-bit object size.

Use -Xcompressedrefs in any of these situations:

-Xcompressedrefs is not recommended for non-x86-based hardware running applications that have enough space in the Java heap provided by the 32-bit JVM.

See the Diagnostics Guide for more detailed information about compressed references.

Pause time

When an application's attempt to create an object cannot be satisfied immediately from the available space in the heap, the Garbage Collector is responsible for identifying unreferenced objects (garbage), deleting them, and returning the heap to a state in which the immediate and subsequent allocation requests can be satisfied quickly.

Such garbage collection cycles introduce occasional unexpected pauses in the execution of application code. Because applications grow in size and complexity, and heaps become correspondingly larger, this garbage collection pause time tends to grow in size and significance.

The default garbage collection value, -Xgcpolicy:optthruput, delivers very high throughput to applications, but at the cost of these occasional pauses, which can vary from a few milliseconds to many seconds, depending on the size of the heap and the quantity of garbage.

Pause time reduction

The JVM uses two techniques to reduce pause times: concurrent garbage collection and generational garbage collection.

The -Xgcpolicy:optavgpause command-line option requests the use of concurrent garbage collection to reduce significantly the time that is spent in garbage collection pauses. Concurrent GC reduces the pause time by performing some garbage collection activities concurrently with normal program execution to minimize the disruption caused by the collection of the heap. The -Xgcpolicy:optavgpause option also limits the effect of increasing the heap size on the length of the garbage collection pause. The -Xgcpolicy:optavgpause option is most useful for configurations that have large heaps. With the reduced pause time, you might experience some reduction of throughput to your applications.

During concurrent garbage collection, a significant amount of time is wasted identifying relatively long-lasting objects that cannot then be collected. If garbage collection concentrates on only the objects that are most likely to be recyclable, you can further reduce pause times for some applications. Generational GC reduces pause times by dividing the heap into two generations: the "new" and the "tenure" areas. Objects are placed in one of these areas depending on their age. The new area is the smaller of the two and contains new objects; the tenure is larger and contains older objects. Objects are first allocated to the new area; if they have active references for long enough, they are promoted to the tenure area.

Generational GC depends on most objects not lasting long. Generational GC reduces pause times by concentrating the effort to reclaim storage on the new area because it has the most recyclable space. Rather than occasional but lengthy pause times to collect the entire heap, the new area is collected more frequently and, if the new area is small enough, pause times are comparatively short. However, generational GC has the drawback that, over time, the tenure area might become full. To minimize the pause time when this situation occurs, use a combination of concurrent GC and generational GC. The -Xgcpolicy:gencon option requests the combined use of concurrent and generational GC to help minimize the time that is spent in any garbage collection pause.

Environments with very full heaps

If the Java heap becomes nearly full, and very little garbage can be reclaimed, requests for new objects might not be satisfied quickly because no space is immediately available.

If the heap is operated at near-full capacity, application performance might suffer regardless of which garbage collection options are used; and, if requests for more heap space continue to be made, the application might receive an OutOfMemoryError, which results in JVM termination if the exception is not caught and handled. At this point, the JVM produces a Javadump file for use during diagnostics. In these conditions, you are recommended either to increase the heap size by using the -Xmx option or to reduce the number of objects in use.

For more information, see the Diagnostics Guide.

Euro symbol support

The IBM SDK and Runtime Environment set the Euro as the default currency for those countries in the European Monetary Union (EMU) for dates on or after 1 January, 2002. From 1 January 2008, Cyprus and Malta also have the Euro as the default currency.

To use the old national currency, specify -Duser.variant=PREEURO on the Java command line.

If you are running the UK, Danish, or Swedish locales and want to use the Euro, specify -Duser.variant=EURO on the Java command line.

Fallback font configuration files

The Linux fallback font configuration files (fontconfig.RedHat.bfc and fontconfig.SuSE.bfc) are installed to provide font settings suitable for new enterprise Linux distributions.

These files are for your convenience only. Their presence does not imply that the new Linux distribution is a supported platform for the IBM SDK and Runtime Environment for Linux platforms, Java Technology Edition, Version 6.

Using Indian and Thai input methods

From Version 6, the Indian and Thai input methods are not available by default. You must manually include the input method jar files in your Java extensions path to use the Indian and Thai input methods.

About this task

In Version 5.0, the input method jar files were included in the jre/lib/ext directory and were automatically loaded by the JVM. In Version 6, the input method jar files are included in the jre/lib/im directory and you must manually add them to the Java extensions path to enable Indian and Thai input methods.

What to do next

If you installed the SDK or Runtime Environment in a different directory, replace /opt/ibm/java-<arch>-60/ with the directory in which you installed the SDK or Runtime Environment.

Developing Java applications

The SDK for Linux contains many tools and libraries required for Java software development.

See Contents of the SDK for details of the tools available.

Using XML

The IBM SDK contains the XML4J and XL XP-J parsers, the XL TXE-J 1.0 XSLT compiler, and the XSLT4J XSLT interpreter. These tools allow you to parse, validate, transform, and serialize XML documents independently from any given XML processing implementation.

Use factory finders to locate implementations of the abstract factory classes, as described in Selecting an XML processor. By using factory finders, you can select a different XML library without changing your Java code.

Available XML libraries

The IBM SDK for Java contains the following XML libraries:

XML4J 4.5

XML4J is a validating parser providing support for the following standards:

XML4J 4.5 is based on Apache Xerces-J 2.9.0. See http://xerces.apache.org/xerces2-j/ for more information.

XL XP-J 1.1

XL XP-J 1.1 is a high-performance non-validating parser that provides support for StAX 1.0 (JSR 173). StAX is a bidirectional API for pull-parsing and streaming serialization of XML 1.0 and XML 1.1 documents. See the XL XP-J reference information section for more details about what is supported by XL XP-J 1.1.

XL TXE-J 1.0.1 Beta

For Version 5.0, the IBM SDK for Java included the XSLT4J compiler and interpreter. The XSLT4J interpreter was used by default.

For Version 6, the IBM SDK for Java includes XL TXE-J. XL TXE-J includes the XSLT4J 2.7.8 interpreter and a new XSLT compiler. The new compiler is used by default. The XSLT4J compiler is no longer included with the IBM SDK for Java. See Migrating to the XL-TXE-J for information about migrating to XL TXE-J.

XL TXE-J provides support for the following standards:

Selecting an XML processor

XML processor selection is performed using service providers. When using a factory finder, Java looks in the following places, in this order, to see which service provider to use:

  1. The system property with the same name as the service provider.
  2. The service provider specified in a properties file.
  3. The contents of the META-INF/services/<service.provider> file.
  4. The default service provider.

The following service providers control the XML processing libraries used by Java:

javax.xml.parsers.SAXParserFactory
Selects the SAX parser. By default, org.apache.xerces.jaxp.SAXParserFactoryImpl from the XML4J library is used.
javax.xml.parsers.DocumentBuilderFactory
Selects the document builder. By default, org.apache.xerces.jaxp.DocumentBuilderFactoryImpl from the XML4J library is used.
javax.xml.datatype.DatatypeFactory
Selects the datatype factory. By default, org.apache.xerces.jaxp.datatype.DatatypeFactoryImpl from the XML4J library is used.
javax.xml.stream.XMLEventFactory
Selects the StAX event factory. By default, com.ibm.xml.xlxp.api.stax.XMLEventFactoryImpl from the XL XP-J library is used.
javax.xml.stream.XMLInputFactory
Selects the StAX parser. By default, com.ibm.xml.xlxp.api.stax.XMLInputFactoryImpl from the XL XP-J library is used.
javax.xml.stream.XMLOutputFactory
Selects the StAX serializer. By default, com.ibm.xml.xlxp.api.stax.XMLOutputFactoryImpl from the XL XP-J library is used.
javax.xml.transform.TransformerFactory
Selects the XSLT processor. Possible values are:
com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl
Use the XL TXE-J compiler. This value is the default.
org.apache.xalan.processor.TransformerFactoryImpl
Use the XSLT4J interpreter.
javax.xml.validation.SchemaFactory:http://www.w3.org/2001/XMLSchema
Selects the schema factory for the W3C XML Schema language. By default, org.apache.xerces.jaxp.validation.XMLSchemaFactory from the XML4J library is used.
javax.xml.xpath.XPathFactory
Selects the XPath processor. By default, org.apache.xpath.jaxp.XPathFactoryImpl from the XSLT4J library is used.

Migrating to the XL-TXE-J

The XL TXE-J compiler has replaced the XSLT4J interpreter as the default XSLT processor. Follow these steps to prepare your application for the new library.

About this task

The XL TXE-J compiler is faster than the XSLT4J interpreter when you are applying the same transformation more than once. If you perform each individual transformation only once, the XL TXE-J compiler is slower than the XSLT4J interpreter because of the compilation and optimization overhead.

To continue using the XSLT4J interpreter as your XSLT processor, set the javax.xml.transform.TransformerFactory service provider to org.apache.xalan.processor.TransformerFactoryImpl.

To migrate to the XL-TXE-J compiler, follow the instructions in this task.

  1. Use com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl when setting the javax.xml.transform.TransformerFactory service provider.
  2. Regenerate class files generated by the XSLT4J compiler. XL TXE-J cannot execute class files generated by the XSLT4J compiler.
  3. Some methods generated by the compiler might exceed the JVM method size limit, in which case the compiler attempts to split these methods into smaller methods. To set the split limit, use the -SPLITLIMIT option when using the Process or Compile commands, or the http://www.ibm.com/xmlns/prod/xltxe-j/split-limit transformer factory attribute when using the transformer factory. The split limit can be between 100 and 2000. When setting the split limit manually, use the highest split limit possible for best performance.
  4. XL TXE-J might need more memory than the XSLT4J compiler. If you are running out of memory or performance seems slow, increase the size of the heap using the -Xmx option.
  5. Migrate your application to use the new attribute keys. The old transformer factory attribute keys are deprecated. The old names are accepted with a warning.
    Table 1. Changes to attribute keys from the XSL4J compiler to the XL TXE-J compiler
    XSL4J compiler attribute XL TXE-J compiler attribute
    translet-name http://www.ibm.com/xmlns/prod/xltxe-j/translet-name
    destination-directory http://www.ibm.com/xmlns/prod/xltxe-j/destination-directory
    package-name http://www.ibm.com/xmlns/prod/xltxe-j/package-name
    jar-name http://www.ibm.com/xmlns/prod/xltxe-j/jar-name
    generate-translet http://www.ibm.com/xmlns/prod/xltxe-j/generate-translet
    auto-translet http://www.ibm.com/xmlns/prod/xltxe-j/auto-translet
    use-classpath http://www.ibm.com/xmlns/prod/xltxe-j/use-classpath
    debug http://www.ibm.com/xmlns/prod/xltxe-j/debug
    indent-number http://www.ibm.com/xmlns/prod/xltxe-j/indent-number
    enable-inlining Obsolete in new compiler
  6. Optional: For best performance, ensure that you are not recompiling XSLT transformations that can be reused. Use one of the following methods to reuse compiled transformations:

XML reference information

The XL XP-J and XL TXE-J XML libraries are new for Version 6 of the SDK. This reference information describes the features supported by these libraries.

XL XP-J reference information

XL XP-J 1.1 is a high-performance non-validating parser that provides support for StAX 1.0 (JSR 173). StAX is a bidirectional API for pull-parsing and streaming serialization of XML 1.0 and XML 1.1 documents.

Unsupported features

The following optional StAX features are not supported by XL XP-J:

XMLInputFactory reference

The javax.xml.stream.XMLInputFactory implementation supports the following properties, as described in the XMLInputFactory Javadoc: http://java.sun.com/javase/6/docs/api/javax/xml/stream/XMLInputFactory.html.

Table 2.
Property name Supported?
javax.xml.stream.isValidating No. The XL XP-J scanner does not support validation.
javax.xml.stream.isNamespaceAware Yes, supports true and false. For XMLStreamReaders created from DOMSources, namespace processing depends on the methods that were used to create the DOM tree, and this value has no effect.
javax.xml.stream.isCoalescing Yes
javax.xml.stream.isReplacingEntityReferences Yes. For XMLStreamReaders created from DOMSources, if entities have already been replaced in the DOM tree, setting this parameter has no effect.
javax.xml.stream.isSupportingExternalEntities Yes
javax.xml.stream.supportDTD

True is always supported. Setting the value to false works only if the com.ibm.xml.xlxp.support.dtd.compat.mode system property is also set to false.

When both properties are set to false, parsers created by the factory throw an XMLStreamException when they encounter an entity reference that requires expansion. This setting is useful for protecting against Denial of Service (DoS) attacks involving entities declared in the DTD.

Setting the value to false does not work before Service Refresh 2.

javax.xml.stream.reporter Yes
javax.xml.stream.resolver Yes

XL XP-J also supports the optional method createXMLStreamReader(javax.xml.transform.Source), which allows StAX readers to be created from DOM and SAX sources.

XL XP-J also supports the javax.xml.stream.isSupportingLocationCoordinates property. If you set this property to true, XMLStreamReaders created by the factory return accurate line, column, and character information using Location objects. If you set this property to false, line, column, and character information is not available. By default, this property is set to false for performance reasons.

XMLStreamReader reference

The javax.xml.stream.XMLStreamReader implementation supports the following properties, as described in the XMLStreamReader Javadoc: http://java.sun.com/javase/6/docs/api/javax/xml/stream/XMLStreamReader.html.

Table 3.
Property name Supported?
javax.xml.stream.entities Yes
javax.xml.stream.notations Yes

XL XP-J also supports the javax.xml.stream.isInterning property. This property returns a boolean value indicating whether or not XML names and namespace URIs returned by the API calls have been interned by the parser. This property is read-only.

XMLOutputFactory reference

The javax.xml.stream.XMLOutputFactory implementation supports the following properties, as described in the XMLOutputFactory Javadoc: http://java.sun.com/javase/6/docs/api/javax/xml/stream/XMLOutputFactory.html.

Table 4.
Property name Supported?
javax.xml.stream.isRepairingNamespaces Yes

XL XP-J also supports the javax.xml.stream.XMLOutputFactory.recycleWritersOnEndDocument property. If you set this property to true, XMLStreamWriters created by this factory are recycled when writeEndDocument() is called. After recycling, some XMLStreamWriter methods, such as getNamespaceContext(), must not be called. By default, XMLStreamWriters are recycled when close() is called. You must call the XMLStreamWriter.close() method when you have finished with an XMLStreamWriter, even if this property is set to true.

XMLStreamWriter reference

The javax.xml.stream.XMLStreamWriter implementation supports the following properties, as described in the XMLStreamWriter Javadoc: http://java.sun.com/javase/6/docs/api/javax/xml/stream/XMLStreamWriter.html.

Table 5.
Property name Supported?
javax.xml.stream.isRepairingNamespaces Yes

Properties on XMLStreamWriter objects are read-only.

XL XP-J also supports the javax.xml.stream.XMLStreamWriter.isSetPrefixBeforeStartElement property. This property returns a Boolean indicating whether calls to setPrefix() and setDefaultNamespace() should occur before calls to writeStartElement() or writeEmptyElement() to put a namespace prefix in scope for that element. XL XP-J always returns false; calls to setPrefix() and setDefaultNamespace() should occur after writeStartElement() or writeEmptyElement().

XL TXE-J reference information

XL TXE-J is an XSLT library containing the XSLT4J 2.7.8 interpreter and a XSLT compiler.

Feature comparison table

Table 6. Comparison of the features in the XSLT4J interpreter, the XSLT4J compiler, and the XL TXE-J compiler.
Feature XSLT4J interpreter (included) XSLT4J compiler (not included) XL TXE-J compiler (included)
http://javax.xml.transform.stream.StreamSource/feature feature Yes Yes Yes
http://javax.xml.transform.stream.StreamResult/feature feature Yes Yes Yes
http://javax.xml.transform.dom.DOMSource/feature feature Yes Yes Yes
http://javax.xml.transform.dom.DOMResult/feature feature Yes Yes Yes
http://javax.xml.transform.sax.SAXSource/feature feature Yes Yes Yes
http://javax.xml.transform.sax.SAXResult/feature feature Yes Yes Yes
http://javax.xml.transform.stax.StAXSource/feature feature Yes No Yes
http://javax.xml.transform.stax.StAXResult/feature feature Yes No Yes
http://javax.xml.transform.sax.SAXTransformerFactory/feature feature Yes Yes Yes
http://javax.xml.transform.sax.SAXTransformerFactory/feature/xmlfilter feature Yes Yes Yes
http://javax.xml.XMLConstants/feature/secure-processing feature Yes Yes Yes
http://xml.apache.org/xalan/features/incremental attribute Yes No No
http://xml.apache.org/xalan/features/optimize attribute Yes No No
http://xml.apache.org/xalan/properties/source-location attribute Yes No No
translet-name attribute N/A Yes Yes (with new name)
destination-directory attribute N/A Yes Yes (with new name)
package-name attribute N/A Yes Yes (with new name)
jar-name attribute N/A Yes Yes (with new name)
generate-translet attribute N/A Yes Yes (with new name)
auto-translet attribute N/A Yes Yes (with new name)
use-classpath attribute N/A Yes Yes (with new name)
enable-inlining attribute No Yes No (obsolete in TL TXE-J)
indent-number attribute No Yes Yes (with new name)
debug attribute No Yes Yes (with new name)
Java extensions Yes Yes (abbreviated syntax only, xalan:component/xalan:script constructs not supported)
JavaScript extensions Yes No No
Extension elements Yes No No
EXSLT extension functions Yes Yes (excluding dynamic) Yes (excluding dynamic)
redirect extension Yes Yes (excluding redirect:open and redirect:close) Yes
output extension No Yes Yes
nodeset extension Yes Yes Yes
NodeInfo extension functions Yes No No
SQL library extension Yes No No
pipeDocument extension Yes No No
evaluate extension Yes No No
tokenize extension Yes No No
XML 1.1 Yes Yes Yes

Notes

  1. With the Process command, use -FLAVOR sr2sw to transform using StAX stream processing, and -FLAVOR er2ew for StAX event processing.
  2. The new compiler does not look for the org.apache.xalan.xsltc.dom.XSLTCDTMManager service provider. Instead, if StreamSource is used, the compiler switches to a high-performance XML parser.
  3. Inlining is obsolete in XL TXE-J.
  4. The org.apache.xalan.xsltc.trax.SmartTransformerFactoryImpl class is no longer supported.

Using an older version of Xerces or Xalan

If you are using an older version of Xerces (before 2.0) or Xalan (before 2.3) in the endorsed override, you might get a NullPointerException when you start your application. This exception occurs because these older versions do not handle the jaxp.properties file correctly.

About this task

To avoid this situation, use one of the following workarounds:

Debugging Java applications

To debug Java programs, you can use the Java Debugger (JDB) application or other debuggers that communicate by using the Java Platform Debugger Architecture (JPDA) that is provided by the SDK for Linux.

More information about problem diagnosis using Java can be found in the Diagnostics Guide.

Java Debugger (JDB)

The Java Debugger (JDB) is included in the SDK for Linux. The debugger is invoked by the jdb command; it attaches to the JVM using JPDA.

To debug a Java application:

  1. Start the JVM with the following options:
    java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=<port> <class>
    The JVM starts up, but suspends execution before it starts the Java application.
  2. In a separate session, you can attach the debugger to the JVM:
    jdb -attach <port>
    The debugger will attach to the JVM, and you can now issue a range of commands to examine and control the Java application; for example, type run to allow the Java application to start.

For more information about JDB options, type:

jdb -help

For more information about JDB commands:

  1. Type jdb
  2. At the jdb prompt, type help

You can also use JDB to debug Java applications running on remote machines. JPDA uses a TCP/IP socket to connect to the remote JVM.

  1. Start the JVM with the following options:
    java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=<port> <class>
    The JVM starts up, but suspends execution before it starts the Java application.
  2. Attach the debugger to the remote JVM:
    jdb -attach <host>:<port>

The Java Virtual Machine Debugging Interface (JVMDI) is not supported in this release. It has been replaced by the Java Virtual Machine Tool Interface (JVMTI).

For more information about JDB and JPDA and their usage, see these Web sites:

Selective debugging

Use the com.ibm.jvm.Debuggable annotation to mark classes and methods that should be available for debugging. Use the -XselectiveDebug parameter to enable selective debugging at run time. The JVM optimizes methods that do not need debugging to provide better performance in a debugging environment.

About this task

Selective debugging is useful when Java is being used as a framework for development, for example, as an IDE. The Java code for the IDE is optimized for performance while the user code is debugged.

  1. Import the Debuggable annotation from the com.ibm.jvm package.
    import com.ibm.jvm.Debuggable;
  2. Decorate methods using the Debuggable annotation.
    @Debuggable
    public int method1() {
      ...
    }
  3. Optional: You can also decorate classes using the Debuggable annotation. All methods in the class will remain debuggable.
    @Debuggable
    public class Class1 {
      ...
    }
  4. Enable selective debugging at run time using the -XselectiveDebug command-line option.

Results

Applications will run faster while being debugged because the core Java API and any IDE code can be optimized for performance.

Determining whether your application is running on a 32-bit or 64-bit JVM

Some Java applications must be able to determine whether they are running on a 32-bit JVM or on a 64-bit JVM. For example, if your application has a native code library, the library must be compiled separately in 32- and 64-bit forms for platforms that support both 32- and 64-bit modes of operation. In this case, your application must load the correct library at runtime, because it is not possible to mix 32- and 64-bit code.

About this task

The system property com.ibm.vm.bitmode allows applications to determine the mode in which your JVM is running. It returns the following values:

You can inspect the com.ibm.vm.bitmode property from within your application code using the call:

System.getProperty("com.ibm.vm.bitmode");

How the JVM processes signals

When a signal is raised that is of interest to the JVM, a signal handler is called. This signal handler determines whether it has been called for a Java or non-Java thread.

If the signal is for a Java thread, the JVM takes control of the signal handling. If an application handler for this signal is installed and you did not specify the -Xnosigchain command-line option, the application handler for this signal is called after the JVM has finished processing.

If the signal is for a non-Java thread, and the application that installed the JVM had previously installed its own handler for the signal, control is given to that handler. Otherwise, if the signal is requested by the JVM or Java application, the signal is ignored or the default action is taken.

For exception and error signals, the JVM either:

For information about writing a launcher that specifies the above hooks, see: http://www.ibm.com/developerworks/java/library/i-signalhandling/. This item was written for Java V1.3.1, but still applies to later versions.

For interrupt signals, the JVM also enters a controlled shutdown sequence, but this time it is treated as a normal termination that:

  1. Calls your application's signal handler for that signal
  2. Calls all application shutdown hooks
  3. Calls any application-installed exit hook
  4. Performs the necessary JVM cleanup

The shutdown is identical to the shutdown initiated by a call to the Java method System.exit().

Other signals that are used by the JVM are for internal control purposes and do not cause it to terminate. The only control signal of interest is SIGQUIT, which causes a Javadump to be generated.

Signals used by the JVM

The types of signals are Exceptions, Errors, Interrupts, and Controls.

Table 7 below shows the signals that are used by the JVM. The signals are grouped in the table by type or use, as follows:

Exceptions
The operating system synchronously raises an appropriate exception signal whenever a fatal condition occurs.
Errors
The JVM raises a SIGABRT if it detects a condition from which it cannot recover.
Interrupts
Interrupt signals are raised asynchronously, from outside a JVM process, to request shutdown.
Controls
Other signals that are used by the JVM for control purposes.

Table 7. Signals used by the JVM
Signal Name Signal type Description Disabled by -Xrs
SIGBUS (7) Exception Incorrect access to memory (data misalignment) Yes
SIGSEGV (11) Exception Incorrect access to memory (write to inaccessible memory) Yes
SIGILL (4) Exception Illegal instruction (attempt to invoke an unknown machine instruction) No
SIGFPE (8) Exception Floating point exception (divide by zero) Yes
SIGABRT (6) Error Abnormal termination. The JVM raises this signal whenever it detects a JVM fault. Yes
SIGINT (2) Interrupt Interactive attention (CTRL-C). JVM exits normally. Yes
SIGTERM (15) Interrupt Termination request. JVM will exit normally. Yes
SIGHUP (1) Interrupt Hang up. JVM exits normally. Yes
SIGQUIT (3) Control A quit signal for a terminal. By default, this triggers a Javadump. Yes
SIGTRAP (5) Control Used by the JIT. Yes
__SIGRTMAX - 2 Control Used by the SDK. No
SIGCHLD (17) Control Used by the SDK for internal control. No

Use the -Xrs (reduce signal usage) option to prevent the JVM from handling most signals. For more information, see Sun's Java application launcher page.

Signals 1 (SIGHUP), 2 (SIGINT), 4 (SIGILL), 7 (SIGBUS), 8 (SIGFPE), 11 (SIGSEGV), and 15 (SIGTERM) on JVM threads cause the JVM to shut down; therefore, an application signal handler should not attempt to recover from these unless it no longer requires the JVM.

Linking a native code driver to the signal-chaining library

The Runtime Environment contains signal-chaining. Signal-chaining enables the JVM to interoperate more efficiently with native code that installs its own signal handlers.

About this task

Signal-chaining enables an application to link and load the shared library libjsig.so before the system libraries. The libjsig.so library ensures that calls such as signal(), sigset(), and sigaction() are intercepted so that their handlers do not replace the JVM's signal handlers. Instead, these calls save the new signal handlers, or "chain" them behind the handlers that are installed by the JVM. Later, when any of these signals are raised and found not to be targeted at the JVM, the preinstalled handlers are invoked.

If you install signal handlers that use sigaction() , some sa_flags are not observed when the JVM uses the signal. These are:

The libjsig.so library also hides JVM signal handlers from the application. Therefore, calls such as signal(), sigset(), and sigaction() that are made after the JVM has started no longer return a reference to the JVM's signal handler, but instead return any handler that was installed before JVM startup.

To use libjsig.so:

The environment variable JAVA_HOME should be set to the location of the SDK, for example,/opt/ibm/java-<arch>-60/.

To use libjsig.a:

Writing JNI applications

Valid JNI version numbers that native programs can specify on the JNI_CreateJavaVM() API call are: JNI_VERSION_1_2(0x00010002) and JNI_VERSION_1_4(0x00010004).

Restriction: Version 1.1 of the Java Native Interface (JNI) is not supported.

This version number determines only the level of the JNI native interface to use. The actual level of the JVM that is created is specified by the JSE libraries (that is, v6). The JNI interface API does not affect the language specification that is implemented by the JVM, the class library APIs, or any other area of JVM behavior. For more information, see http://java.sun.com/javase/6/docs/technotes/guides/jni/.

If your application needs two JNI libraries, one built for 32- and the other for 64-bit, use the com.ibm.vm.bitmode system property to determine if you are running with a 32- or 64-bit JVM and choose the appropriate library.

To compile and link a native application with the SDK, use the following command:

gcc -I/opt/ibm/java-<arch>-60/include -L/opt/ibm/java-<arch>-60/jre/lib/<arch>/j9vm 
-ljvm -ldl -lpthread <JNI program filename>

The -ljvm option specifies that libjvm.so is the shared library that implements the JVM. The -lpthread option indicates that you are using native pthread support; if you do not link with the pthread library, a segmentation fault (signal SIGSEGV) might be caused when you run the JNI program.

Support for thread-level recovery of blocked connectors

Four new IBM-specific SDK classes have been added to the com.ibm.jvm package to support the thread-level recovery of Blocked connectors. The new classes are packaged in core.jar.

These classes allow you to unblock threads that have become blocked on networking or synchronization calls. If an application does not use these classes, it must end the whole process, rather than interrupting an individual blocked thread.

The classes are:

public interface InterruptibleContext
Defines two methods, isBlocked() and unblock(). The other three classes implement InterruptibleContext.
public class InterruptibleLockContext
A utility class for interrupting synchronization calls.
public class InterruptibleIOContext
A utility class for interrupting network calls.
public class InterruptibleThread
A utility class that extends java.lang.Thread, to allow wrapping of interruptible methods. It uses instances of InterruptibleLockContext and InterruptibleIOContext to perform the required isBlocked() and unblock() methods depending on whether a synchronization or networking operation is blocking the thread.

Both InterruptibleLockContext and InterruptibleIOContext work by referencing the current thread. Therefore if you do not use InterruptibleThread, you must provide your own class that extends java.lang.Thread, to use these new classes.

The Javadoc for these classes is provided with the SDK in the docs/content/apidoc directory.

Configuring large page memory allocation

You can enable large page support, on systems that support it, by starting Java with the -Xlp option.

About this task

Large page usage is primarily intended to provide performance improvements to applications that allocate a lot of memory and frequently access that memory. The large page performance improvements are mainly caused by the reduced number of misses in the Translation Lookaside Buffer (TLB). The TLB maps a larger virtual memory range and thus causes this improvement.

Large page support must be available in the kernel, and enabled, to allow Java to use large pages.

To configure large page memory allocation, first ensure that the running kernel supports large pages. Check that the file /proc/meminfo contains the following lines:

HugePages_Total:     <number of pages>
HugePages_Free:      <number of pages>
Hugepagesize:        <page size, in kB>

The number of pages available and their sizes vary between distributions.

If large page support is not available in your kernel, these lines will not exist in the /proc/meminfo file. In this case, you must install a new kernel containing support for large pages.

If large page support is available, but not enabled, HugePages_Total will be 0. In this case, your administrator must enable large page support. Check your operating system manual for more instructions.

For the JVM to use large pages, your system must have an adequate number of contiguous large pages available. If large pages cannot be allocated, even when enough pages are available, possibly the large pages are not contiguous. Configuring the number of large pages at bootup will create them contiguously.

Large page allocations will only succeed if the user is a member of the group whose gid is stored in /proc/sys/vm/hugetlb_chm_group, or if Java is run with root access. See http://devresources.linux-foundation.org/dev/robustmutexes/src/fusyn.hg/Documentation/vm/hugetlbpage.txt for more information.

If a non-root user needs access to large pages, their locked memory limit must be increased. The locked memory limit must be at least as large as the maximum size of the Java heap. The maximum size of the Java heap can be specified using the -Xmx command-line option, or determined by adding -verbose:sizes and inspecting the output for the value -Xmx. If pam is not installed, change the locked memory limit using the ulimit command. If pam is installed, change the locked memory limit by adding the following lines to /etc/security/limits.conf:

@<large group name> soft memlock 2097152
@<large group name> hard memlock 2097152

Where <large group name> is the name of the group whose gid is stored in /proc/sys/vm/hugetlb_chm_group.

CORBA support

The Java Platform, Standard Edition (JSE) supports, at a minimum, the specifications that are defined in the compliance document from Sun. In some cases, the IBM JSE ORB supports more recent versions of the specifications.

The minimum specifications supported are defined in the Official Specifications for CORBA support in Java SE 6: http://java.sun.com/javase/6/docs/api/org/omg/CORBA/doc-files/compliance.html.

Support for GIOP 1.2

This SDK supports all versions of GIOP, as defined by chapters 13 and 15 of the CORBA 2.3.1 specification, OMG document formal/99-10-07.

http://www.omg.org/cgi-bin/doc?formal/99-10-07

Bidirectional GIOP is not supported.

Support for Portable Interceptors

This SDK supports Portable Interceptors, as defined by the OMG in the document ptc/01-03-04, which you can obtain from:

http://www.omg.org/cgi-bin/doc?ptc/01-03-04

Portable Interceptors are hooks into the ORB that ORB services can use to intercept the normal flow of execution of the ORB.

Support for Interoperable Naming Service

This SDK supports the Interoperable Naming Service, as defined by the OMG in the document ptc/00-08-07, which you can obtain from:

http://www.omg.org/cgi-bin/doc?ptc/00-08-07

The default port that is used by the Transient Name Server (the tnameserv command), when no ORBInitialPort parameter is given, has changed from 900 to 2809, which is the port number that is registered with the IANA (Internet Assigned Number Authority) for a CORBA Naming Service. Programs that depend on this default might have to be updated to work with this version.

The initial context that is returned from the Transient Name Server is now an org.omg.CosNaming.NamingContextExt. Existing programs that narrow the reference to a context org.omg.CosNaming.NamingContext still work, and do not need to be recompiled.

The ORB supports the -ORBInitRef and -ORBDefaultInitRef parameters that are defined by the Interoperable Naming Service specification, and the ORB::string_to_object operation now supports the ObjectURL string formats (corbaloc: and corbaname:) that are defined by the Interoperable Naming Service specification.

The OMG specifies a method ORB::register_initial_reference to register a service with the Interoperable Naming Service. However, this method is not available in the Sun Java Core API at Version 6. Programs that need to register a service in the current version must invoke this method on the IBM internal ORB implementation class. For example, to register a service "MyService":

((com.ibm.CORBA.iiop.ORB)orb).register_initial_reference("MyService",
serviceRef);

Where orb is an instance of org.omg.CORBA.ORB, which is returned from ORB.init(), and serviceRef is a CORBA Object, which is connected to the ORB. This mechanism is an interim one, and is not compatible with future versions or portable to non-IBM ORBs.

System properties for tracing the ORB

A runtime debug feature provides improved serviceability. You might find it useful for problem diagnosis or it might be requested by IBM service personnel.

Tracing Properties

com.ibm.CORBA.Debug=true
Turns on ORB tracing.
com.ibm.CORBA.CommTrace=true
Adds GIOP messages (sent and received) to the trace.
com.ibm.CORBA.Debug.Output=<file>
Specify the trace output file. By default, this is of the form orbtrc.DDMMYYYY.HHmm.SS.txt.

Example of ORB tracing

For example, to trace events and formatted GIOP messages from the command line, type:

java -Dcom.ibm.CORBA.Debug=true
     -Dcom.ibm.CORBA.CommTrace=true <myapp>

Limitations

Do not turn on tracing for normal operation, because it might cause performance degradation. Even if you have switched off tracing, FFDC (First Failure Data Capture) is still working, so serious errors are reported. If a debug output file is generated, examine it to check on the problem. For example, the server might have stopped without performing an ORB.shutdown().

The content and format of the trace output might vary from version to version.

System properties for tuning the ORB

The ORB can be tuned to work well with your specific network. The properties required to tune the ORB are described here.

com.ibm.CORBA.FragmentSize=<size in bytes>
Used to control GIOP 1.2 fragmentation. The default size is 1024 bytes.

To disable fragmentation, set the fragment size to 0 bytes:

java -Dcom.ibm.CORBA.FragmentSize=0 <myapp>
com.ibm.CORBA.RequestTimeout=<time in seconds>
Sets the maximum time to wait for a CORBA Request. By default the ORB waits indefinitely. Do not set the timeout too low to avoid connections ending unnecessarily.
com.ibm.CORBA.LocateRequestTimeout=<time in seconds>
Set the maximum time to wait for a CORBA LocateRequest. By default the ORB waits indefinitely.
com.ibm.CORBA.ListenerPort=<port number>
Set the port for the ORB to read incoming requests on. If this property is set, the ORB starts listening as soon as it is initialized. Otherwise, it starts listening only when required.

Java security permissions for the ORB

When running with a Java SecurityManager, invocation of some methods in the CORBA API classes might cause permission checks to be made, which might result in a SecurityException. If your program uses any of these methods, ensure that it is granted the necessary permissions.

Table 8. Methods affected when running with Java SecurityManager
Class/Interface Method Required permission
org.omg.CORBA.ORB init java.net.SocketPermission resolve
org.omg.CORBA.ORB connect java.net.SocketPermission listen
org.omg.CORBA.ORB resolve_initial_references java.net.SocketPermission connect
org.omg.CORBA. portable.ObjectImpl _is_a java.net.SocketPermission connect
org.omg.CORBA. portable.ObjectImpl _non_existent java.net.SocketPermission connect
org.omg.CORBA. portable.ObjectImpl OutputStream _request (String, boolean) java.net.SocketPermission connect
org.omg.CORBA. portable.ObjectImpl _get_interface_def java.net.SocketPermission connect
org.omg.CORBA. Request invoke java.net.SocketPermission connect
org.omg.CORBA. Request send_deferred java.net.SocketPermission connect
org.omg.CORBA. Request send_oneway java.net.SocketPermission connect
javax.rmi. PortableRemoteObject narrow java.net.SocketPermission connect

ORB implementation classes

A list of the ORB implementation classes.

The ORB implementation classes in this release are:

These are the default values, and you are advised not to set these properties or refer to the implementation classes directly. For portability, make references only to the CORBA API classes, and not to the implementation. These values might be changed in future releases.

RMI over IIOP

Java Remote Method Invocation (RMI) provides a simple mechanism for distributed Java programming. RMI over IIOP (RMI-IIOP) uses the Common Object Request Broker Architecture (CORBA) standard Internet Inter-ORB Protocol (IIOP) to extend the base Java RMI to perform communication. This allows direct interaction with any other CORBA Object Request Brokers (ORBs), whether they were implemented in Java or another programming language.

The following documentation is available:

Implementing the Connection Handler Pool for RMI

Thread pooling for RMI Connection Handlers is not enabled by default.

About this task

To enable the connection pooling implemented at the RMI TCPTransport level, set the option

-Dsun.rmi.transport.tcp.connectionPool=true

This version of the Runtime Environment does not have a setting that you can use to limit the number of threads in the connection pool.

Enhanced BigDecimal

From Java 5.0, the IBM BigDecimal class has been adopted by Sun as java.math.BigDecimal. The com.ibm.math.BigDecimal class is reserved for possible future use by IBM and is currently deprecated. Migrate existing Java code to use java.math.BigDecimal.

The new java.math.BigDecimal uses the same methods as both the previous java.math.BigDecimal and com.ibm.math.BigDecimal. Existing code using java.math.BigDecimal continues to work correctly. The two classes do not serialize.

To migrate existing Java code to use the java.math.BigDecimal class, change the import statement at the top of your .java file from: import com.ibm.math.*; to import java.math.*;.

Support for XToolkit

The IBM SDK for Linux, v6 includes XToolkit by default. You need XToolkit when using the Eclipse's SWT_AWT bridge to build an application that uses both SWT and Swing.

Restriction: Motif is no longer supported and will be removed in a later release.

Related links:

Plug-in, Applet Viewer and Web Start

The Java plug-in is used to run Java applications in the browser. The appletviewer is used to test applications designed to be run in a browser. Java Web Start is used to deploy desktop Java applications over a network, and provides a mechanism for keeping them up-to-date.

(Linux IA 32-bit and PPC32 only) Using the Java plug-in

The Java plug-in is a Web browser plug-in. You use the Java plug-in to run applets in the browser.

You must allow applets to finish loading to prevent your browser from stopping. For example, if you use the Back button and then the Forward button while an applet is loading, the HTML pages might be unable to load.

The Java plug-in is documented by Sun at: http://java.sun.com/javase/6/docs/technotes/guides/plugin/developer_guide/.

Supported browsers

The Java plug-in supports SeaMonkey, Mozilla, and Mozilla Firefox.

Table 9. Browsers supported by the Java plug-in on Linux IA32
Browser Supported versions
Mozilla 1.7, 1.8
Firefox 2.0, |3.0
Table 10. Browsers supported by the Java plug-in on Linux PPC32
Browser Supported Versions
Mozilla 1.6
SeaMonkey 1.0.8

Later minor releases of browsers are also supported.

Installing the Java plug-in

To install the Java plug-in, symbolically link it to the plug-in directory for your browser.

The Java plug-in is based on Mozilla's Open JVM Integration initiative, which is used with most Mozilla products and derivatives, including Firefox.

You must symbolically link the plug-in, rather than copy it, so that it can locate the JVM.

Mozilla

Symbolically link the Java plug-in to the plug-ins directory for the Mozilla Web browser. Use the "about" information in Mozilla to verify the Java plug-in is correctly installed.

Before you begin

Only Mozilla versions 1.4 and later are supported.

To install the plug-in on Mozilla:

  1. Log in as root.
  2. Change to your Mozilla plug-ins directory (which differs, depending on the Linux distributions).
  3. Create a symbolic link to the plug-in.
     ln -s /opt/ibm/java-<arch>-60/jre/plugin/<arch>/ns7/libjavaplugin_oji.so .
    Where <arch> is the architecture of your system.

Results

To verify that the Java plug-in is available and enabled, select Help -> About plug-ins in Mozilla.

What to do next

You must symbolically link the plug-in, rather than copy it, so that it can locate the JVM.

Restriction: You can have only one Java plug-in shared library in /usr/local/mozilla/plugins/. Mozilla attempts to load anything that is in that directory, (or subdirectories underneath it), as a plug-in, and results are unpredictable if two versions of the Java plug-in are loaded.

Firefox

About this task

These steps make the Java plug-in available to all users.

  1. Log in as root.
  2. Change to your Firefox plug-ins directory (which differs, depending on the Linux distributions).
    cd /usr/local/mozilla-firefox/plugins/
  3. Create a symbolic link to the plug-in.
     ln -s /opt/ibm/java-<arch>-60/jre/plugin/<arch>/ns7/libjavaplugin_oji.so .
    Where <arch> is the architecture of your system.

What to do next

You must symbolically link the plug-in, rather than copy it, so that it can locate the JVM.

Common Document Object Model (DOM) support

Because of limitations in particular browsers, you might not be able to implement all the functions of the org.w3c.dom.html package.

One of the following errors is thrown:

Using DBCS parameters

The Java plug-in supports double-byte characters (for example, Chinese Traditional BIG-5, Korean, and Japanese) as parameters for the tags <APPLET>, <OBJECT>, and <EMBED>. You must select the correct character encoding for your HTML document so that the Java plug-in can parse the parameter.

About this task

Specify character encoding for your HTML document by using the <META> tag in the <HEAD> section like this:

<meta http-equiv="Content-Type" content="text/html; charset=big5">

This example tells the browser to use the Chinese BIG-5 character encoding to parse the HTML file.

Working with applets

With the Applet Viewer, you can run one or more applets that are called by reference in a Web page (HTML file) by using the <APPLET> tag. The Applet Viewer finds the <APPLET> tags in the HTML file and runs the applets, in separate windows, as specified by the tags.

Because the Applet Viewer is for viewing applets, it cannot display a whole Web page that contains many HTML tags. It parses only the <APPLET> tags and no other HTML on the Web page.

Running and debugging applets with the Applet Viewer

Use the following commands to run and debug an applet with the Applet Viewer.

About this task

Running applets with the Applet Viewer:

From a shell prompt, enter:

   appletviewer <name>

where <name> is one of the following:

For example, to invoke the Applet Viewer on an HTML file that calls an applet, type at a shell prompt:

  appletviewer $HOME/<filename>.html

Where filename is the name of the HTML file.

To invoke the Applet Viewer on a Web page, type at a shell prompt:

appletviewer http://java.sun.com/applets/jdk/1.4/demo/applets/NervousText/example1.html

The Applet Viewer does not recognize the charset option of the <

META

> tag. If the file that the Applet Viewer loads is not encoded as the system default, an I/O exception might occur. To avoid the exception, use the -encoding option when you run appletviewer. For example:

appletviewer -encoding JISAutoDetect sample.html

Debugging applets with the Applet Viewer:

For example:

cd demo/applets/TicTacToe
../../../bin/appletviewer -debug example1.html

You can find documentation about how to debug applets using the Applet Viewer at the Sun Web site: http://java.sun.com/javase/6/docs/technotes/guides/plugin/developer_guide/debugger.html.

(Linux IA 32-bit, PPC32, and PPC64 only) Using Web Start

Java Web Start is used for Java application deployment.

With Web Start, you can launch and manage applications directly from the Web. Applications are cached to minimize installation times. Applications are automatically upgraded when new versions become available.

Web Start supports these java-vm-args documented at http://java.sun.com/javase/6/docs/technotes/guides/javaws/developersguide/syntax.html#resources:

Web Start also supports -Xgcpolicy to set the garbage collection policy.

For information about the browsers that support Web Start, see Supported browsers.

For more information about Web Start, see:

For more information about deploying applications, see:

Running Web Start

Web Start can be run from a Web page or the command line. Web Start applications are stored in the Java Application Cache.

About this task

You can invoke Web Start in a number of different ways.

(Linux IA 32-bit only) WebStart Secure Static Versioning

Static versioning allows Web Start applications to request a specific JVM version on which those applications will run. Because static versioning also allows applications to exploit old security vulnerabilities on systems which have been upgraded to a new JVM, Secure Static Versioning (SSV) is now used by default.

With SSV, the user is warned before running any unsigned Web Start application that requests a specific JVM, if the requested JVM is installed. Signed applications and applications that request the latest version of the JVM run as normal.

You can disable SSV by setting the deployment.javaws.ssv.enabled property in the deployment.properties file to false.

Distributing Java applications

Java applications typically consist of class, resource, and data files.

When you distribute a Java application, your software package probably consists of the following parts:

To run your application, a user needs the Runtime Environment for Linux. The SDK for Linux software contains a Runtime Environment. However, you cannot assume that your users have the SDK for Linux software installed.

Your SDK for Linux software license does not allow you to redistribute any of the SDK's files with your application. You must ensure that a licensed version of the SDK for Linux is installed on the target machine.

Class data sharing between JVMs

Class data sharing allows multiple JVMs to share a single space in memory.

The Java Virtual Machine (JVM) allows you to share class data between JVMs by storing it in a memory-mapped cache file on disk. Sharing reduces the overall virtual memory consumption when more than one JVM shares a cache. Sharing also reduces the startup time for a JVM after the cache has been created. The shared class cache is independent of any active JVM and persists until it is destroyed.

A shared cache can contain:

Overview of class data sharing

Class data sharing provides a transparent method of reducing memory footprint and improving JVM start-up time. Java 6 provides new and improved features in cache management, isolation, and performance.

Enabling class data sharing

Enable class data sharing by using the -Xshareclasses option when starting a JVM. The JVM connects to an existing cache or creates a new cache if one does not exist.

All bootstrap and application classes loaded by the JVM are shared by default. Custom classloaders share classes automatically if they extend the application classloader; otherwise, they must use the Java Helper API provided with the JVM to access the cache. See Adapting custom classloaders to share classes.

The JVM can also store ahead-of-time (AOT) compiled code in the cache for certain methods to improve the startup time of subsequent JVMs. The AOT compiled code is not shared between JVMs, but is cached to reduce compilation time when the JVM starts up. The amount of AOT code stored in the cache is determined heuristically. You cannot control which methods get stored in the cache, but you can set upper and lower limits on the amount of cache space used for AOT code, or you can choose to disable AOT caching completely. See Class data sharing command-line options for more information.

Cache access

A JVM can access a cache with either read-write or read-only access. Any JVM connected to a cache with read-write access can update the cache. Any number of JVMs can concurrently read from the cache, even while another JVM is writing to it.

You must take care if runtime bytecode modification is being used. See Runtime bytecode modification for more information.

Dynamic updating of the cache

Because the shared class cache persists beyond the lifetime of any JVM, the cache is updated dynamically to reflect any modifications that might have been made to JARs or classes on the file system. The dynamic updating makes the cache transparent to the application using it.

Cache security

Access to the shared class cache is limited by operating system permissions and Java security permissions. The shared class cache is created with user access by default unless the groupAccess command-line suboption is used. Only a classloader that has registered to share class data can update the shared class cache.

The cache memory is protected against accidental or deliberate corruption using memory page protection. This protection is not an absolute guarantee against corruption because the JVM must unprotect pages to write to them. The only way to guarantee that a cache cannot be modified is to open it read-only.

If a Java SecurityManager is installed, classloaders, excluding the default bootstrap, application, and extension classloaders, must be granted permission to share classes by adding SharedClassPermission lines to the java.policy file. See Using SharedClassPermission. The RuntimePermission createClassLoader restricts the creation of new classloaders and therefore also restricts access to the cache.

Cache lifespan

Multiple caches can exist on a system and you specify them by name as a suboption to the -Xshareclasses command. A JVM can connect to only one cache at any one time.

You can override the default cache size on startup using -Xscmx<n><size>. This size is then fixed for the lifetime of the cache. Caches exist until they are explicitly destroyed using a suboption to the -Xshareclasses command or the cache file is deleted manually.

Cache utilities

All cache utilities are suboptions to the -Xshareclasses command. See Class data sharing command-line options or use -Xshareclasses:help to see a list of available suboptions.

Class data sharing command-line options

Class data sharing and the cache management utilities are controlled using command-line options to the Java launcher.

For options that take a <size> parameter, suffix the number with "k" or "K" to indicate kilobytes, "m" or "M" to indicate megabytes, or "g" or "G" to indicate gigabytes.

-Xscmaxaot<size>
Sets the maximum number of bytes in the cache that can be used for AOT data. Use this option to ensure a certain amount of cache space is available for non-AOT data. By default, the maximum limit for AOT data is the amount of free space in the cache. The value of this option should not be smaller than the value of -Xscminaot and must not be larger than the value of -Xscmx.
-Xscminaot<size>
Sets the minimum number of bytes in the cache to reserve for AOT data. By default, no space is reserved for AOT data, although AOT data is written to the cache until the cache is full or the -Xscmaxaot limit is reached. The value of this option must not exceed the value of -Xscmx or -Xscmaxaot. The value of -Xscminaot must always be considerably less than the total cache size because AOT data can be created only for cached classes. If the value of -Xscminaot is equal to the value of -Xscmx, no class data or AOT data is stored because AOT data must be associated with a class in the cache.
-Xscmx<size>
Specifies cache size. This option applies only if a cache is being created and no cache of the same name exists. The default cache size is platform-dependent. You can find out the size value being used by adding -verbose:sizes as a command-line argument. The minimum cache size is 4 KB. The maximum cache size is also platform-dependent. (See Cache size limits.)
-Xshareclasses:<suboption>[,<suboption>...]
Enables class data sharing. Can take a number of suboptions, some of which are cache utilities. Cache utilities perform the required operation on the specified cache, without starting the VM. You can combine multiple suboptions, separated by commas, but the cache utilities are mutually exclusive. When running cache utilities, the message Could not create the Java virtual machine is expected. Cache utilities do not create the virtual machine.

Some cache utilities can work with caches from previous Java versions or caches created by JVMs with different bit-widths. These caches are referred to as "incompatible" caches.

You can use the following suboptions with the -Xshareclasses option:

help
Lists all the command-line suboptions.
name=<name>
Connects to a cache of a given name, creating the cache if it does not already exist. Also used to indicate the cache that is to be modified by cache utilities; for example, destroy. Use the listAllCaches utility to show which named caches are currently available. If you do not specify a name, the default name "sharedcc_%u" is used. %u in the cache name inserts the current user name. You can specify "%g" in the cache name to insert the current group name.
cacheDir=<directory>
Sets the directory in which cache data is read and written. By default, <directory> is /tmp/javasharedresources. The user must have sufficient permissions in <directory>. The JVM writes persistent cache files directly into the directory specified. Persistent cache files can be safely moved and deleted from the file system. Non-persistent caches are stored in shared memory and have control files that describe the location of the memory. Control files are stored in a javasharedresources subdirectory of the cacheDir specified. Do not move or delete control files in this directory. The listAllCaches utility, the destroyAll utility, and the expire suboption work only in the scope of a given cacheDir.
readonly
Opens an existing cache with read-only permissions. The JVM does not create a new cache with this suboption. Opening a cache read-only prevents the JVM from making any updates to the cache. It also allows the JVM to connect to caches created by other users or groups without requiring write access. By default, this suboption is not specified.
persistent (default)
Uses a persistent cache. The cache is created on disk, which persists beyond operating system restarts. Non-persistent and persistent caches can have the same name.
nonpersistent
Uses a non-persistent cache. The cache is created in shared memory, which is lost when the operating system shuts down. Non-persistent and persistent caches can have the same name. You must always use the nonpersistent suboption when running utilities such as destroy on a non-persistent cache.
groupAccess
Sets operating system permissions on a new cache to allow group access to the cache. The default is user access only.
verbose
Enables verbose output, which provides overall status on the shared class cache and more detailed error messages.
verboseAOT
Enables verbose output when compiled AOT code is being found or stored in the cache. AOT code is generated heuristically. You might not see any AOT code generated at all for a small application. You can disable AOT caching using the noaot suboption.
verboseIO
Gives detailed output on the cache I/O activity, listing information on classes being stored and found. Each classloader is given a unique ID (the bootstrap loader is always 0) and the output shows the classloader hierarchy at work, where classloaders must ask their parents for a class before they can load it themselves. It is normal to see many failed requests; this behavior is expected for the classloader hierarchy.
verboseHelper
Enables verbose output for the Java Helper API. This output shows you how the Helper API is used by your ClassLoader.
silent
Turns off all shared classes messages, including error messages. Unrecoverable error messages, which prevent the JVM from initializing, are displayed.
nonfatal
Allows the JVM to start even if class data sharing fails. Normal behavior for the JVM is to refuse to start if class data sharing fails. If you select nonfatal and the shared classes cache fails to initialize, the JVM attempts to connect to the cache in read-only mode. If this attempt fails, the JVM starts without class data sharing.
none
Can be added to the end of a command line to disable class data sharing. This suboption overrides class sharing arguments found earlier on the command line.
modified=<modified context>
Used when a JVMTI agent is installed that might modify bytecode at runtime. If you do not specify this suboption and a bytecode modification agent is installed, classes are safely shared with an extra performance cost. The <modified context> is a descriptor chosen by the user; for example, "myModification1". This option partitions the cache, so that only JVMs using context myModification1 can share the same classes. For instance, if you run HelloWorld with a modification context and then run it again with a different modification context, all classes are stored twice in the cache. See Runtime bytecode modification for more information.
reset
Causes a cache to be destroyed and then recreated when the JVM starts up. Can be added to the end of a command line as -Xshareclasses:reset.
destroy (Utility option)
Destroys a cache specified by the name, cacheDir, and nonpersistent suboptions. A cache can be destroyed only if all JVMs using it have shut down, and the user has sufficient permissions.
destroyAll (Utility option)
Tries to destroy all caches available using the specified cacheDir and nonpersistent suboptions. A cache can be destroyed only if all JVMs using it have shut down, and the user has sufficient permissions.
expire=<time in minutes>
Destroys all caches that have been unused for the time specified before loading shared classes. This option is not a utility option because it does not cause the JVM to exit.
listAllCaches (Utility option)
Lists all the compatible and incompatible caches that exist in the specified cache directory. If you do not specify cacheDir, the default directory is used. Summary information, such as Java version and current usage is displayed for each cache.
printStats (Utility option)
Displays summary information for the cache specified by the name, cacheDir, and nonpersistent suboptions. The most useful information displayed is how full the cache is and how many classes it contains. Stale classes are classes that have been updated on the file system and which the cache has therefore marked "stale". Stale classes are not purged from the cache and can be reused. See the Diagnostics Guide for more information.
printAllStats (Utility option)
Displays detailed information for the cache specified by the name, cacheDir, and nonpersistent suboptions. Every class is listed in chronological order, with a reference to the location from which it was loaded. AOT code for class methods is also listed.

See the Diagnostics Guide for more information.

mprotect=[ all | default | none ]
By default, the memory pages containing the cache are protected at all times, unless a specific page is being updated. This protection helps prevent accidental or deliberate corruption to the cache. The cache header is not protected by default because this protection has a small performance cost. Specifying all ensures that all the cache pages are protected, including the header. Specifying none disables the page protection.
noBootclasspath
Prevents storage of classes loaded by the bootstrap classloader in the shared classes cache. Can be used with the SharedClassURLFilter API to control exactly which classes get cached. See the Diagnostics Guide for more information about shared class filtering.
cacheRetransformed
Enables caching of classes that have been transformed using the JVMTI RetransformClasses function.
noaot
Disables caching of AOT code. AOT code already in the shared data cache can be loaded.

Creating, populating, monitoring, and deleting a cache

An overview of the lifecycle of a shared class data cache including examples of the cache management utilities.

To enable class data sharing, add -Xshareclasses[:name=<name>] to your application command line.

The JVM either connects to an existing cache of the given name or creates a new cache of that name. If a new cache is created, it is populated with all bootstrap and application classes being loaded until the cache becomes full. If two or more JVMs are started concurrently, they populate the cache concurrently.

To check that the cache has been created, run java -Xshareclasses:listAllCaches. To see how many classes and how much class data is being shared, run java -Xshareclasses:[name=<name>],printStats. You can run these utilities after the application JVM has terminated or in another command window.

For more feedback on cache usage while the JVM is running, use the verbose suboption. For example, java -Xshareclasses:[name=<name>],verbose.

To see classes being loaded from the cache or stored in the cache, add -Xshareclasses:[name=<name>],verboseIO to your application command line.

To delete the cache, run java -Xshareclasses:[name=<name>],destroy. You usually delete caches only if they contain many stale classes or if the cache is full and you want to create a bigger cache.

You should tune the cache size for your specific application, because the default is unlikely to be the optimum size. To determine the optimum cache size, specify a large cache, using -Xscmx, run the application, and then use printStats to determine how much class data has been stored. Add a small amount to the value shown in printStats for contingency. Because classes can be loaded at any time during the lifetime of the JVM, it is best to do this analysis after the application has terminated. However, a full cache does not have a negative impact on the performance or capability of any JVMs connected to it, so it is acceptable to decide on a cache size that is smaller than required.

If a cache becomes full, a message is displayed on the command line of any JVMs using the verbose suboption. All JVMs sharing the full cache then loads any further classes into their own process memory. Classes in a full cache can still be shared, but a full cache is read-only and cannot be updated with new classes.

Performance and memory consumption

Class data sharing is particularly useful on systems that use more than one JVM running similar code; the system benefits from reduced virtual memory consumption. It is also useful on systems that frequently start up and shut down JVMs, which benefit from the improvement in startup time.

The overhead to create and populate a new cache is minimal. The JVM startup cost in time for a single JVM is typically between 0 and 5% slower compared with a system not using class data sharing, depending on how many classes are loaded. JVM startup time improvement with a populated cache is typically between 10% and 40% faster compared with a system not using class data sharing, depending on the operating system and the number of classes loaded. Multiple JVMs running concurrently show greater overall startup time benefits.

Duplicate classes are consolidated in the shared class cache. For example, class A loaded from myClasses.jar and class A loaded from myOtherClasses.jar (with identical content) is stored only once in the cache. The printAllStats utility shows multiple entries for duplicated classes, with each entry pointing to the same class.

When you run your application with class data sharing, you can use the operating system tools to see the reduction in virtual memory consumption.

Considerations and limitations of using class data sharing

Consider these factors when deploying class data sharing in a product and using class data sharing in a development environment.

Cache size limits

The maximum theoretical cache size is 2 GB. The size of cache you can specify is limited by the amount of physical memory and paging space available to the system.

The cache for sharing classes is allocated using the System V IPC Shared memory mechanism.

Because the virtual address space of a process is shared between the shared classes cache and the Java heap, if you increase the maximum size of the Java heap you might reduce the size of the shared classes cache you can create.

Cache size is limited by SHMMAX settings, which limits the amount of shared memory that can be allocated. You can find these settings by looking at the/proc/sys/kernel/shmmax file. SHMMAX is usually set to 30 MB.

Runtime bytecode modification

Any JVM using a JVM Tool Interface (JVMTI) agent that can modify bytecode data must use the modified=<modified_context> suboption if it wants to share the modified classes with another JVM.

The modified context is a user-specified descriptor that describes the type of modification being performed. The modified context partitions the cache so that all JVMs running under the same context share a partition.

This partitioning allows JVMs that are not using modified bytecode to safely share a cache with those that are using modified bytecode. All JVMs using a given modified context must modify bytecode in a predictable, repeatable manner for each class, so that the modified classes stored in the cache have the expected modifications when they are loaded by another JVM. Any modification must be predictable because classes loaded from the shared class cache cannot be modified again by the agent.

If a JVMTI agent is used without a modification context, classes are still safely shared by the JVM, but with a small impact on performance. Using a modification context with a JVMTI agent avoids the need for extra checks and therefore has no impact on performance. A custom ClassLoader that extends java.net.URLClassLoader and modifies bytecode at load time without using JVMTI automatically stores that modified bytecode in the cache, but the cache does not treat the bytecode as modified. Any other VM sharing that cache loads the modified classes. You can use the modified=<modification_context> suboption in the same way as with JVMTI agents to partition modified bytecode in the cache. If a custom ClassLoader needs to make unpredictable load-time modifications to classes, that ClassLoader must not attempt to use class data sharing.

See the Diagnostics Guide for more detail on this topic.

Operating system limitations

You cannot share classes between 32-bit and 64-bit JVMs. Temporary disk space must be available to hold cache information. The operating system enforces cache permissions.

For operating systems that can run both 32-bit and 64-bit applications, class data sharing is not permitted between 32-bit and 64-bit JVMs. The listAllCaches suboption lists 32-bit or 64-bit caches, depending on the address mode of the JVM being used.

The shared class cache requires disk space to store identification information about the caches that exist on the system. This information is stored in /tmp/javasharedresources. If the identification information directory is deleted, the JVM cannot identify the shared classes on the system and must re-create the cache. Use the ipcs command to view the memory segments used by a JVM or application.

Users running a JVM must be in the same group to use a shared class cache. The operating system enforces the permissions for accessing a shared class cache. If you do not specify a cache name, the user name is appended to the default name so that multiple users on the same system create their own caches by default.

Using SharedClassPermission

If a SecurityManager is being used with class data sharing and the running application uses its own class loaders, you must grant these class loaders shared class permissions before they can share classes.

You add shared class permissions to the java.policy file using the ClassLoader class name (wildcards are permitted) and either "read", "write", or "read,write" to determine the access granted. For example:

permission com.ibm.oti.shared.SharedClassPermission
        "com.abc.customclassloaders.*", "read,write";

If a ClassLoader does not have the correct permissions, it is prevented from sharing classes. You cannot change the permissions of the default bootstrap, application, or extension class loaders.

Adapting custom classloaders to share classes

Any classloader that extends java.net.URLClassLoader can share classes without modification. You must adopt classloaders that do not extend java.net.URLClassLoader to share class data.

You must grant all custom classloaders shared class permissions if a SecurityManager is being used; see Using SharedClassPermission. IBM provides several Java interfaces for various types of custom classloaders, which allow the classloaders to find and store classes in the shared class cache. These classes are in the com.ibm.oti.shared package.

The Javadoc for this package is provided with the SDK in the docs/content/apidoc directory.

See the Diagnostics Guide for more information about how to use these interfaces.

Java Communications API (JavaComm)

The Java Communications (API) package (JavaComm) is an optional package provided for use with the Runtime Environment for Linux on the IA32, PPC32/PPC64, and AMD64/EM64T platforms. You install JavaComm independently of the SDK or Runtime Environment.

The JavaComm API gives Java applications a platform-independent way of performing serial and parallel port communications for technologies such as voice mail, fax, and smartcards.

The Java Communications API supports Electronic Industries Association (EIA)-232 (RS232) serial ports and Institute of Electrical and Electronics Engineers (IEEE) 1284 parallel ports and is supported on systems with the IBM Version 6 Runtime Environment.

Using the Java Communications API, you can:

Installing Java Communications API from a compressed file

Make sure that the SDK or Runtime Environment is installed before you install the Java Communications API.

About this task

If you used the RPM package to install Java originally, install the Java Communications API from the RPM file. To install the Java Communications API from an RPM package, see Installing the Java Communications API from an RPM file.

To install the Java Communications API from a compressed file:

  1. Put the Java Communications API compressed file, ibm-java-javacomm-3.0-0.0-<plat>-<arch>.tar.gz, in the directory where the SDK or Runtime Environment is installed. If you installed to the default directory, this is /opt/ibm/java-<arch>-60/.
  2. From a shell prompt, in the directory containing the compressed file, extract the contents:
    tar -xvzf ibm-java-javacomm-3.0-0.0-<plat>-<arch>.tar.gz

    Where <arch> represents your architecture: i386, x86_64, ppc, or ppc64.

  3. Copy the Java Communications API files into the correct directories within your SDK.
    1. Copy lib/libLinuxSerialParallel.so to your jre/lib/<arch>/ directory. Where <arch> is the architecture of your platform.
    2. Copy jar/comm.jar to your jre/lib/ext/ directory.
    3. Copy lib/javax.comm.properties to your jre/lib/ directory.
    By default, the SDK is installed in the /opt/ibm/java-<arch>-60/ directory.

Installing the Java Communications API from an RPM file

Make sure that a copy of the SDK or Runtime Environment is installed before you install the Java Communications API.

About this task

If you used the RPM package to install Java originally, install the Java Communications API from the RPM file.

  1. Open a shell prompt, making sure you are root.
  2. Use the rpm -ivh command to install the Java Communications API RPM file. For example:
    rpm -ivh ibm-java-<arch>-javacomm-3.0-0.0.rpm
    The Java Communications API is installed within the /opt/ibm/java-<arch>-60/ directory structure.
  3. Copy the javacomm files into the correct directories within your SDK.
    1. Copy lib/libLinuxSerialParallel.so to your jre/lib/<arch>/ directory. Where <arch> is the architecture of your platform.
    2. Copy jar/comm.jar to your jre/lib/ext/ directory.
    3. Copy lib/javax.comm.properties to your jre/lib/ directory.
    By default, the SDK is installed in the /opt/ibm/java-<arch>-60/ directory.

Location of the Java Communications API files

By default, the Java Communications API files are installed in the /opt/ibm/java-<arch>-60/ directory.

The files and their structure are:

Configuring the Java Communications API

To use the Java Communications API, you must change the access mode of serial and parallel ports, and set the PATH if you did not set it when you installed Java.

About this task

See Setting the path.

Changing the access mode of serial and parallel ports

After you install Java Communications API, you must change the access mode of serial and parallel ports so that users can access these devices.

About this task

You must give a user read and write access to the required devices. Log on as root and use the following commands, as applicable:

    chmod 660 /dev/ttyS0    (serial port COM1)
    chmod 660 /dev/ttyS1    (serial port COM2)
    chmod 660 /dev/ttyS2    (serial port COM3)
    chmod 660 /dev/ttyS3    (serial port COM4)
    chmod 660 /dev/parport0 (raw parallel ports)
    chmod 660 /dev/parport1 (raw parallel ports)

Add specific users to the group in which the devices reside. On a SUSE system, for example, the devices are in the uucp group. Thus, users can be added to the uucp group to gain access to the devices.

Change the access mode of any other ports as needed.

Specifying devices in the javax.comm.properties file

Use the javax.comm.properties file to specify the devices and drivers that are available to the Java Communications API and whether they are parallel or serial. Do not change this file without a very clear understanding of its use.

About this task

The following properties must be defined:

driver=<driver_name>
serpath0=<serial_port_device>


parpath0=<parallel_port_device>

For example:

# Implementation specific driver
driver=com.sun.comm.LinuxDriver

# Paths to server-side serial port devices
serpath0 = /dev/ttyS0
serpath1 = /dev/ttyS1

# Paths to server-side parallel port devices
parpath0 = /dev/parport0
parpath1 = /dev/parport1

For parallel port access, use /dev/parport<n>. /dev/lp<n> is not supported in Javacomm version 3.0.

Enabling serial ports on IBM ThinkPads

Most ThinkPads have their serial ports disabled by default in the BIOS. Currently, there is no way to enable the ports with Linux (the tpctl package does not enable the ports if they are disabled in the BIOS).

About this task

To enable the ports in the BIOS, you must use the DOS version of the ThinkPad Configuration Utility that is available from the IBM ThinkPad Download site. To use the ThinkPad Configuration Utility, you need a bootable DOS diskette. The ThinkPad Configuration Utility might have been installed as part of the ThinkPad Utilities under Windows®, depending on your installation options, and you can run it from a command prompt in Windows.

The ThinkPad Configuration application provided with Windows has options to enable or disable the serial and parallel ports but this does not also change the settings in the BIOS. So if you use this application with Windows, the ports are available; however, if you reboot your system with Linux, the ports will not be enabled.

Printing limitation with the Java Communications API

When printing with the Java Communications API, you might have to select "Form feed", "Continue", or a similar option on the printer.

Uninstalling Java Communications API

The process you use to uninstall the Java Communications API depends on whether you installed the installable Red Hat Package Manager (RPM) package or the compressed Tape Archive (TAR) package.

About this task

Uninstalling the Red Hat Package Manager (RPM) package

Uninstalling the Java Communications API using the RPM package.

About this task

  1. Use the rpm tool to uninstall the package. Enter the following command at a shell prompt:
    rpm -e ibm-java-<arch>-javacomm-3.0-0.0

    Where <arch> is the architecture of your platform.

    Alternatively, you can use a graphical tool such as kpackage or yast2.
  2. If the directory where you installed the Java Communications API does not contain any other tools that you require, remove that directory from your PATH statement.
  3. If you copied the Java communications API libraries into the SDK directory, delete the following files from the SDK directory.

    Where <arch> is the architecture of your platform.

    By default, the SDK is installed in the /opt/ibm/java-<arch>-60/ directory.

Uninstalling the compressed Tape Archive (TAR) package

Uninstalling the Java Communications API, if you installed the compressed TAR package.

About this task

Delete the following files from the directory where you installed them:

Where <arch> is the architecture of your platform.

The Java Communications API documentation

You can find API documentation and samples for the Java Communications API at the Sun Web site.

http://java.sun.com/products/javacomm/.

Service and support for independent software vendors

Contact points for service:

If you are entitled to services for the Program code pursuant to the IBM Solutions Developer Program, contact the IBM Solutions Developer Program through your normal method of access or on the Web at: http://www.ibm.com/partnerworld/.

If you have purchased a service contract (that is, IBM's Personal Systems Support Line or equivalent service by country), the terms and conditions of that service contract determine what services, if any, you are entitled to receive with respect to the Program.

Accessibility

The user guides that are supplied with this SDK and the Runtime Environment have been tested using screen readers.

To change the font sizes in the user guides, use the function that is supplied with your browser, typically found under the View menu option.

For users who require keyboard navigation, a description of useful keystrokes for Swing applications is in Swing Key Bindings at http://www.ibm.com/developerworks/java/jdk/additional/.

Keyboard traversal of JComboBox components in Swing

If you traverse the drop-down list of a JComboBox component with the cursor keys, the button or editable field of the JComboBox does not change value until an item is selected. This is the correct behavior for this release and improves accessibility and usability by ensuring that the keyboard traversal behavior is consistent with mouse traversal behavior.

Web Start accessibility (Linux IA 32-bit, PPC32, and PPC64 only)

From Version 5.0, Java Web Start contains several accessibility and usability improvements, including better support for screen readers and improved keyboard navigation.

You can use the command line to launch a Java application that is enabled for Web Start. To change preference options, you must edit a configuration file, .java/.deployment/.deployment.properties in the user's home directory. Take a backup before you edit this file. Not all of the preferences that can be set in the Java Application Cache Viewer are available in the configuration file.

Any comments on this user guide?

If you have any comments about this user guide, contact us through one of the following channels. Note that these channels are not set up to answer technical queries, but are for comments about the documentation only.

Send your comments:

The fine print. By choosing to send a message to IBM, you acknowledge that all information contained in your message, including feedback data, such as questions, comments, suggestions, or the like, shall be deemed to be non-confidential and IBM shall have no obligation of any kind with respect to such information and shall be free to reproduce, use, disclose, and distribute the information to others without limitation. Further, IBM shall be free to use any ideas, concepts, know-how or techniques contained in such information for any purpose whatsoever, including, but not limited to, developing, manufacturing and marketing products incorporating such information.

Appendix A. Nonstandard options

The -X options listed below are nonstandard and subject to change without notice.

For options that take a <size> parameter, suffix the number with "k" or "K" to indicate kilobytes, "m" or "M" to indicate megabytes, or "g" or "G" to indicate gigabytes.

For options that take a <percentage> parameter, use a number from 0 to 1. For example, 50% is 0.5.

-Xargencoding
Allows you to put Unicode escape sequences in the argument list. This option is set to off by default.
-Xbootclasspath:<directories and zip or jar files separated by :>
Sets the search path for bootstrap classes and resources. The default is to search for bootstrap classes and resources within the internal VM directories and .jar files.
-Xbootclasspath/a:<directories and zip or jar files separated by :>
Appends the specified directories, zip, or jar files to the end of bootstrap class path. The default is to search for bootstrap classes and resources within the internal VM directories and .jar files.
-Xbootclasspath/p:<directories and zip or jar files separated by :>
Prepends the specified directories, zip, or jar files to the front of the bootstrap class path. Do not deploy applications that use the -Xbootclasspath: or -Xbootclasspath/p: option to override a class in the standard API, because such a deployment would contravene the Java Runtime Environment binary code license. The default is to search for bootstrap classes and resources within the internal VM directories and .jar files.
-Xcheck:classpath
Displays a warning message if an error is discovered in the class path, for example, a missing directory or JAR file.
-Xcheck:gc[:<scan options>][:<verify options>][:<misc options>]
Performs additional checks on garbage collection. By default, no checking is performed. See the output of -Xcheck:gc:help for more information.
-Xcheck:jni
Performs additional checks for JNI functions. By default, no checking is performed.
-Xcheck:memory[:<option>]
Identifies memory leaks inside the JVM using strict checks that cause the JVM to exit on failure. If no option is specified, all is used by default. See the output of -Xcheck:memory:help or the Diagnostics Guide for more information.
-Xcheck:nabounds
Performs additional checks for JNI functions. By default, no checking is performed.
-Xclassgc
Enables collection of class objects at every garbage collection. See also -Xnoclassgc. By default, this option is enabled.
-Xcodecache<size>
Sets the unit size of which memory blocks are allocated to store native code of compiled Java methods. An appropriate size can be chosen for the application being run. By default, this is selected internally according to the CPU architecture and the capability of your system.
-Xcompactexplicitgc
Performs a compaction for every call to System.gc(). See also -Xnocompactexplicitgc. By default, compaction occurs only when triggered internally.
-Xcompactgc
Performs a compaction for every garbage collection. See also -Xnocompactgc. By default, compaction occurs only when triggered internally.
-Xcompressedrefs
(64-bit only) Uses 32-bit values for references. See More effective heap usage using compressed references for more information. By default, references are 64-bit.
-Xconcurrentbackground<number>
Specifies the number of low priority background threads attached to assist the mutator threads in concurrent mark. The default is 1.
-Xconcurrentlevel<number>
Specifies the allocation "tax" rate. It indicates the ratio between the amount of heap allocated and the amount of heap marked. The default is 8.
-Xconmeter:<soa|loa|dynamic>
Determines which area's usage, LOA (Large Object Area) or SOA (Small Object Area), is metered and hence which allocations are taxed during concurrent mark. The allocation tax is applied to the selected area. If -Xconmeter:dynamic is specified, the collector dynamically determines the area to meter based on which area is exhausted first. By default, the option is set to -Xconmeter:soa.
-Xdbg:<options>
Loads debugging libraries to support the remote debugging of applications. See Debugging Java applications for more information. Specifying -Xrunjdwp provides the same support.
-Xdebug
Starts the JVM with the debugger enabled. By default, the debugger is disabled.
-Xdisableexcessivegc
Disables the throwing of an OutOfMemoryError if excessive time is spent in the GC. By default, this option is off.
-Xdisableexplicitgc
Signals to the VM that calls to System.gc() should have no effect. By default, calls to System.gc() trigger a garbage collection.
-Xdisablestringconstantgc
Prevents strings in the string intern table from being collected. By default, this option is disabled.
-Xdisablejavadump
Turns off Javadump generation on errors and signals. By default, Javadump generation is enabled.
-Xenableexcessivegc
If excessive time is spent in the GC, this option returns NULL for an allocate request and thus causes an OutOfMemoryError to be thrown. This action occurs only when the heap has been fully expanded and GC is taking 95% of the available time. This behavior is the default.
-Xenableexplicitgc
Signals to the VM that calls to System.gc() should trigger a garbage collection. This is the default.
-Xenablestringconstantgc
Enables strings from the string intern table to be collected. By default, this option is enabled.
-Xfuture
Turns on strict class-file format checks. Use this flag when you are developing new code because stricter checks will become the default in future releases. By default, strict format checks are disabled.
-Xgcpolicy:<optthruput|optavgpause|gencon|subpool> (subpool on PPC and zSeries)
Controls the behavior of the Garbage Collector. See Garbage collection options for more information.
-Xgcthreads<number of threads>
Sets the number of helper threads that are used for parallel operations during garbage collection. By default, the number of threads is one less than the number of physical CPUs present, with a minimum of 1. The maximum value is the number of physical CPUs present.
-Xgcworkpackets<number>
Specifies the total number of work packets available in the global collector. If not specified, the collector allocates a number of packets based on the maximum heap size.
-Xint
Makes the JVM use only the Interpreter, disabling the Just-In-Time (JIT) compiler. By default, the JIT compiler is enabled.
-Xiss<size>
Sets the initial Java thread stack size. 2 KB by default. Use the -verbose:sizes option to output the value that the VM is using.
-Xjarversion
See Obtaining version information.
-Xjit[:<suboption>,<suboption>...]
Enables the JIT. For details of the sub-options, see the Diagnostics Guide. See also -Xnojit. By default, the JIT is enabled.
-Xjni:<suboptions>
Sets JNI options. You can use the following suboptions with the -Xjni option:
-Xjni:arrayCacheMax=[<size in bytes>|unlimited]
Sets the maximum size of the array cache. The default size is 8096 bytes.
-Xlinenumbers
Displays line numbers in stack traces, for debugging. See also -Xnolinenumbers. By default, line numbers are on.
-Xloa
Allocates a large object area (LOA). Objects will be allocated in this LOA rather than the SOA. By default, the LOA is enabled for all GC policies except for subpool, where the LOA is not available. See also -Xnoloa.
-Xloainitial<percentage>
<percentage> is between 0 and 0.95, which specifies the initial percentage of the current tenure space allocated to the large object area (LOA). The default is 0.05 or 5%.
-Xloamaximum<percentage>
<percentage> is between 0 and 0.95, which specifies the maximum percentage of the current tenure space allocated to the large object area (LOA). The default is 0.5 or 50%.
-Xlp
Requests the JVM to allocate the Java heap with large pages. If large pages are not available, the JVM will not start, displaying the error message GC: system configuration does not support option --> '-Xlp'. The JVM uses shmget() to allocate large pages for the heap. Large pages are supported by systems running Linux kernels v2.6 or higher, or earlier kernels where large page support has been backported by the distribution. By default, large pages are not used. See Configuring large page memory allocation.
-Xmaxe<size>
Sets the maximum amount by which the garbage collector expands the heap. Typically, the garbage collector expands the heap when the amount of free space falls below 30% (or the amount specified using -Xminf), by the amount required to restore the free space to 30%. The -Xmaxe option limits the expansion to the specified value; for example -Xmaxe10M limits the expansion to 10 MB. By default, there is no maximum expansion size.
-Xmaxf<percentage>
Specifies the maximum percentage of heap that must be free after a garbage collection. If the free space exceeds this amount, the JVM attempts to shrink the heap. The default value is 0.6 (60%).
-Xmca<size>
Sets the expansion step for the memory allocated to store the RAM portion of loaded classes. Each time more memory is required to store classes in RAM, the allocated memory is increased by this amount. By default, the expansion step is 32 KB. Use the -verbose:sizes option to output the value that the VM is using.
-Xmco<size>
Sets the expansion step for the memory allocated to store the ROM portion of loaded classes. Each time more memory is required to store classes in ROM, the allocated memory is increased by this amount. By default, the expansion step is 128 KB. Use the -verbose:sizes option to output the value that the VM is using.
-Xmine<size>
Sets the minimum amount by which the Garbage Collector expands the heap. Typically, the garbage collector expands the heap by the amount required to restore the free space to 30% (or the amount specified using -Xminf). The -Xmine option sets the expansion to be at least the specified value; for example, -Xmine50M sets the expansion size to a minimum of 50 MB. By default, the minimum expansion size is 1 MB.
-Xminf<percentage>
Specifies the minimum percentage of heap that should be free after a garbage collection. If the free space falls below this amount, the JVM attempts to expand the heap. By default, the minimum value is 0.3 (30%).
-Xmn<size>
Sets the initial and maximum size of the new area to the specified value when using -Xgcpolicy:gencon. Setting -Xmn is equivalent to setting -Xmns and -Xmnx. If you set either -Xmns or -Xmnx, you cannot set -Xmn. If you attempt to set -Xmn with either -Xmns or -Xmnx, the VM will not start, returning an error. By default, -Xmn is selected internally according to your system's capability. Use the -verbose:sizes option to output the value that the VM is using.
-Xmns<size>
Sets the initial size of the new area to the specified value when using -Xgcpolicy:gencon. By default, this option is selected internally according to your system's capability. This option will return an error if you try to use it with -Xmn. Use the -verbose:sizes option to output the value that the VM is using.
-Xmnx<size>
Sets the maximum size of the new area to the specified value when using -Xgcpolicy:gencon. By default, this option is selected internally according to your system's capability. This option will return an error if you try to use it with -Xmn. Use the -verbose:sizes option to output the value that the VM is using.
-Xmo<size>
Sets the initial and maximum size of the old (tenured) heap to the specified value when using -Xgcpolicy:gencon. Equivalent to setting both -Xmos and -Xmox. If you set either -Xmos or -Xmox, you cannot set -Xmo. If you attempt to set -Xmo with either -Xmos or -Xmox, the VM will not start, returning an error. By default, -Xmo is selected internally according to your system's capability. Use the -verbose:sizes option to output the value that the VM is using.
-Xmoi<size>
Sets the amount the Java heap is incremented when using -Xgcpolicy:gencon. If set to zero, no expansion is allowed. By default, the increment size is calculated on the expansion size, -Xmine and -Xminf.
-Xmos<size>
Sets the initial size of the old (tenure) heap to the specified value when using -Xgcpolicy:gencon. By default, this option is selected internally according to your system's capability. This option will return an error if you try to use it with -Xmo. Use the -verbose:sizes option to output the value that the VM is using.
-Xmox<size>
Sets the maximum size of the old (tenure) heap to the specified value when using -Xgcpolicy:gencon. By default, this option is selected internally according to your system's capability. This option will return an error if you try to use it with -Xmo. Use the -verbose:sizes option to output the value that the VM is using.
-Xmr<size>
Sets the size of the Garbage Collection "remembered set" when using -Xgcpolicy:gencon. This is a list of objects in the old (tenured) heap that have references to objects in the new area heap. By default, this option is set to 16 kilobytes. Use the -verbose:sizes option to output the value that the VM is using.
-Xmrx<size>
Sets the remembered maximum size setting.
-Xms<size>
Sets the initial Java heap size. You can also use -Xmo. The default is set internally according to your system's capability. Use the -verbose:sizes option to output the value that the VM is using.
-Xmso<size>
Sets the C stack size for forked Java threads. By default, this option is set to 32 KB on 32-bit platforms and 256 KB on 64-bit platforms. Use the -verbose:sizes option to output the value that the VM is using.
-Xmx<size>
Sets maximum Java heap size. By default, this option is set internally according to your system's capability. Use the -verbose:sizes option to output the value that the VM is using.
-Xnoclassgc
Disables class garbage collection. This option switches off garbage collection of storage associated with Java classes that are no longer being used by the JVM. See also -Xclassgc. By default, class garbage collection is performed.
-Xnocompactexplicitgc
Disables compaction on a call to System.gc(). See also -Xcompactexplicitgc. By default, compaction is enabled on calls to System.gc().
-Xnocompactgc
Disables compaction for the Garbage Collector. See also -Xcompactgc. By default, compaction is enabled.
-Xnojit
Disables the JIT compiler. See also -Xjit. By default, the JIT compiler is enabled.
-Xnolinenumbers
Disables the line numbers for debugging. See also -Xlinenumbers. By default, line number are on.
-Xnoloa
Prevents allocation of a large object area (LOA). All objects will be allocated in the SOA. By default, the LOA is enabled for all GC policies except for subpool, where the LOA is not available. See also -Xloa.
-Xnopartialcompactgc
Disables incremental compaction. See also -Xpartialcompactgc.
-Xnosigcatch
Disables JVM signal handling code. See also -Xsigcatch. By default, signal handling is enabled.
-Xnosigchain
Disables signal handler chaining. See also -Xsigchain. By default, the signal handler chaining is enabled.
-Xoptionsfile=<file>
Specifies a file that contains JVM options and defines. By default, no option file is used.

The options file does not support the following options:

.

-Xoss<size>
Sets the Java stack size and C stack size for any thread. This option is provided for compatibility and is equivalent to setting both -Xss and -Xmso to the specified value.
-Xpartialcompactgc
Enables partial compaction. By default, this option is not set, so all compactions are full. See also -Xnopartialcompactgc.
-Xquickstart
Improves startup time by delaying JIT compilation and optimizations. By default, quickstart is disabled and there is no delay in JIT compilation.
-Xrdbginfo:<host>:<port>
Loads and passes options to the remote debug information server. By default, the remote debug information server is disabled.
-Xrs
Reduces the use of operating system signals. By default, the VM makes full use of operating system signals, see Signals used by the JVM.
-Xrun<library name>[:<options>]
Loads helper libraries. To load multiple libraries, specify it more than once on the command line. Examples of these libraries are:
-Xrunhprof[:help] | [:<option>=<value>, ...]
Performs heap, CPU, or monitor profiling. For more information, see the Diagnostics Guide.
-Xrunjdwp[:help] | [:<<option>=< value>, ...]
Loads debugging libraries to support the remote debugging of applications. See -Xdbg for more information.
-Xrunjnichk[:help] | [:<option>=<value>, ...]
Deprecated, use -Xcheck:jni.
-Xscmx<size>
For details of -Xscmx, see Class data sharing command-line options.
-XselectiveDebug
Enables selective debugging. Use the com.ibm.jvm.Debuggable annotation to mark classes and methods that should be available for debugging. The JVM optimizes methods that do not need debugging to provide better performance in a debugging environment. See Selective debugging for more information.
-Xshareclasses:<options>
For details of the -Xshareclasses options, see Class data sharing command-line options.
-Xsigcatch
Enables VM signal handling code. See also -Xnosigcatch. By default, signal handling is enabled.
-Xsigchain
Enables signal handler chaining. See also -Xnosigchain. By default, signal handler chaining is enabled.
-Xsoftrefthreshold<number>
Sets the hint used by the GC to determine the number of GCs after which a soft reference will be cleared if its referent has not been marked. The default is 32, meaning that the soft reference will be cleared after 32*(percent of free heap space) GC cycles where its referent was not marked.
-Xss<size>
Sets the maximum Java stack size for any thread. By default, this option is set to 256 KB. Use the -verbose:sizes option to output the value that the VM is using.
-Xverbosegclog:<path to file>[X,Y]

Causes verbose garbage collection (GC) output to be written to the specified file. If the file exists, it is overwritten. Otherwise, if an existing file cannot be opened or a new file cannot be created, the output is redirected to stderr. If you specify the arguments X and Y (both are integers) the verbose GC output is redirected to X number of files, each containing Y number of gc cycles worth of verbose GC output. These files have the form filename1, filename2, and so on. By default, no verbose GC logging occurs.

See the Diagnostics Guide for more information about verbose GC output.

-Xverify
Enables strict class checking for every class that is loaded. By default, strict class checking is disabled.
-Xverify:none
Disables strict class checking. By default, strict class checking is disabled.

Appendix B. Known limitations

Known limitations on the SDK and Runtime Environment for Linux.

You can find more help with problem diagnosis in the Diagnostics Guide at http://www.ibm.com/developerworks/java/jdk/diagnosis/60.html.

| | |

Installation |on Ubuntu using RPM

|

Installation can fail using RPM on Ubuntu |because the RPM package dependencies are not met. The dependencies |are met by Ubuntu packages. You can install the IBM SDK for Java using |the .tgz package, or you can force RPM installation |by using the --nodeps command-line option. For |example:

|
rpm -ivh --nodeps ibm-java-<arch>-sdk-6.0-3.0.<arch>.rpm

Where <arch> is |the architecture of your system.

|

The following error is displayed |if you try to install using RPM without the -nodeps option:

|
error: Failed dependencies:
|        glibc >= 2.3 is needed by ibm-java-<arch>-sdk-6.0-3.0.<arch>
|        libstdc++.so.5 is needed by ibm-java-<arch>-sdk-6.0-3.0.<arch>
|        /bin/sh is needed by ibm-java-<arch>-sdk-6.0-3.0.<arch>

CUPS support

The IBM SDK for Java does not support printing using the CUPS interface.

BIOS settings on AMD64 SMP systems

The Node memory interleaving BIOS setting must be set to DISABLED. Otherwise, unpredictable results might occur, including Java crashes and hangs. This instruction is in accordance with AMD's recommendation.

JConsole monitoring tool Local tab

In IBM's JConsole tool, the Local tab, which allows you to connect to other Virtual Machines on the same system, is not available. Also, the corresponding command-line pid option is not supported. Instead, use the Remote tab in JConsole to connect to the Virtual Machine that you want to monitor. Alternatively, use the connection command-line option, specifying a host of localhost and a port number. When you launch the application that you want to monitor, set these command-line options:

-Dcom.sun.management.jmxremote.port=<value>
Specifies the port the management agent should listen on.
-Dcom.sun.management.jmxremote.authenticate=false
Disables authentication unless you have created a username file.
-Dcom.sun.management.jmxremote.ssl=false
Disables SSL encryption.

| | |

GUI applications, |such as the JConsole monitoring tool, on 64-bit Ubuntu with a 32-bit |JVM

|

When running a 32-bit JVM on a 64-bit Ubuntu system, |GUI applications will not start because some AWT libraries are missing. |To fix the problem, install the 32-bit libraries using the ia32-libs package:

|
sudo apt-get install ia32-libs

The |following exception is thrown if the libraries are not available:

|
Exception in thread "main" java.lang.UnsatisfiedLinkError: awt (An exception was pending after running JNI_OnLoad)
|        at java.lang.ClassLoader.loadLibraryWithPath(ClassLoader.java:993)
|        at java.lang.ClassLoader.loadLibraryWithClassLoader(ClassLoader.java:962)
|        at java.lang.System.loadLibrary(System.java:465)
|        ... lines removed for clarity ...

Incorrect stack traces when loading new classes after an Exception is caught

If new classes are loaded after an Exception has been caught, the stack trace contained within the Exception might become incorrect. The stack trace becomes incorrect if classes in the stack trace are unloaded, and new classes are loaded into their memory segments.

Web Start and Java 1.3 applications

The IBM SDK for Linux, v6 Web Start does not support launching Java 1.3 applications.

Slow DSA key pair generation

Creating DSA key pairs of unusual lengths can take a significant amount of time on slow machines. Do not interpret the delay as a hang because the process will complete if sufficient time is allowed. The DSA key generation algorithm has been optimized to generate standard key lengths (for instance, 512, 1024) more quickly than others.

Creating a JVM using JNI

Native programs cannot create a VM with JNI_VERSION_1_1(0x00010001) interfaces. You cannot call JNI_CreateJavaVM() and pass it a version of JNI_VERSION_1_1(0x00010001). The versions that can be passed are:

The VM created is determined by the Java libraries present (that is, 1.2.2, 1.3.x, 1.4.x, 5.x, 6.x), not the one that is implied by the JNI interface version passed.

The interface version does not affect any area of VM behavior other than the functions available to native code.

Window managers and keyboard shortcuts

Your window manager might override some of the Java keyboard shortcuts. If you need to use an overridden Java keyboard shortcut, consult your operating system manual and change your window manager keyboard shortcuts.

X Window System file descriptors

The X Window System is unable to use file descriptors above 255. Because the JVM holds file descriptors for open jar files, X can run out of file descriptors. As a workaround, you can set the JAVA_HIGH_ZIPFDS environment variable to tell the JVM to use higher file descriptors for jar files.

To use the JAVA_HIGH_ZIPFDS environment variable, set it to a value between 0 and 512. The JVM will then open the first jar files using file descriptors up to 1024. For example, if your program is likely to load 300 jar files:

export JAVA_HIGH_ZIPFDS=300

The first 300 jar files will then be loaded using the file descriptors 724 to 1023. Any jar files opened after that will be opened in the normal range.

DBCS and the KDE clipboard

You might not be able to use the system clipboard with double-byte character set (DBCS) to copy information between Linux applications and Java applications if you are running the K Desktop Environment (KDE).

Limit on threads using the LinuxThreads library

On SLES9 and newer distributions, the default threading library is NPTL, which implements Java threads as native threads. On earlier distributions, the default threading library is LinuxThreads, which implements threads as new processes. If the number of Java threads exceeds the maximum number of processes allowed, your program might hang.

The maximum number of threads available is determined by the lowest of:

However, you might run out of virtual storage before you reach the maximum number of threads.

ThreadMXBean Thread User CPU Time limitation

There is no way to distinguish between user mode CPU time and system mode CPU time on this platform. ThreadMXBean.getThreadUserTime(), ThreadMXBean.getThreadCpuTime(), ThreadMXBean.getCurrentThreadUserTime(), and ThreadMXBean.getCurrentThreadCpuTime() all return the total CPU time for the required thread.

KeyEvents and window managers

KeyEvent results that include the Alt key might differ between window managers in Linux. They also differ from results of other operating systems. When using the default settings, Ctrl+Alt+A in the KWin window manager produces a KeyEvent, whereas Ctrl+Alt+A in the Metacity window manager does not produce a key event.

The X Window System and the Meta key

On the Linux X Window System, the keymap is set to: 64 0xffe9 (Alt_L) 0xffe7 (Meta_L), and 113 0xffea (Alt_R) 0xffe8 (Meta_R). You can check this by typing the following at a shell prompt:

xmodmap -pk  

This is why the SDK considers that Meta and Alt are being pressed together. As a workaround, you can remove the Meta_x mapping by typing the following at a shell prompt:

xmodmap -e "keysym Alt_L = Alt_L" -e "keysym Alt_R = Alt_R"  

This workaround might affect other X-Window applications that are running on the same display if they use the Meta-key that was removed.

SIGSEGV when creating a JVM using JNI

A call to JNI_CreateJavaVM() from a JNI application might cause a segmentation fault (signal SIGSEGV); to avoid this fault, rebuild your JNI program specifying the option -lpthread.

Lack of resources with highly-threaded applications

If you are running with a lot of concurrent threads, you might get a warning message:

java.lang.OutOfMemoryError

This is an indication that your machine is running out of system resources and messages can be caused by the following reasons:

Try tuning your system to increase the corresponding system resources.

| | |

National |language support on Ubuntu

|

For Chinese, Korean, and Japanese |language users of Ubuntu only.

|

Chinese, Korean, and Japanese |locales will not display the correct fonts if CJK fonts are not used. |Input Method selection has not been tested.

X Server and client font problems

When running a Java AWT or Swing application on a Linux machine and exporting the display to a second machine, you might experience problems displaying some dialogs if the set of fonts loaded on the X client machine is different from the set loaded on the X server machine. To avoid this problem, install the same fonts on both machines.

UTF-8 encoding and MalformedInputExceptions

If your system locale is using a UTF-8 encoding, some SDK tools might throw a sun.io.MalformedInputException. To find out whether your system is using a UTF-8 encoding, examine the locale-specific environment variables such as LANG or LC_ALL to see if they end with the suffix ".UTF-8". If you get this sun.io.MalformedInputException, change characters that are not within the 7-bit ASCII range (0x00 - 0x7f) and are not represented as Java Unicode character literals to Java Unicode character literals (for example: '\u0080'). You can also work around this problem by removing the ".UTF-8" suffix from the locale-specific environment variables; for example, if your machine has default locale of "en_US.UTF-8", set LANG to "en_US".

AMI and xcin problems when exporting displays

If you are using AMI and xcin in a cross-platform environment (for example, if you try to export the display between a 32-bit and a 64-bit system, or between a big-endian and a little-endian system) there might be some problems. If you have this kind of problem, upgrade to the latest version of AMI and xcin.

RHEL4 and XIM

For Chinese, Korean and Japanese language users of RHEL4 only.

No XIM server is installed by default. To input DBCS characters to a Java application, please install a XIM server package such as iiimf-x or kinput2.

RHEL4 and IIIMF

For Chinese, Korean, and Japanese language users of RHEL4 only.

If you are using the Internet/Intranet Input Method Framework (IIIMF), use IIIMF packages that are included in Red Hat Enterprise Linux 4 Update 2 or later. Contact Red Hat for guidance, at http://www.redhat.com.

(zSeries 64-bit only) You might experience IIIMF failures or a failure to start. To resolve the problem, upgrade to the latest IIIMF packages.

(Traditional Chinese on PPC, s390, or s390x only) IIIMF might not work. To resolve the problem, use iiimf-le-xcin-0.1.7-13.EL4 or later.

(Simplified Chinese on PPC, s390, or s390x only) IIIMF might not work correctly. To resolve the problem, use IIMF packages included in RHEL4 Update 5 or later.

RHEL4 and the zh_CN.GB18030 locale

Simplified Chinese language users of RHEL4 only.

The zh_CN.GB18030 locale is not supported by xlib in RHEL4. xterm cannot activate Input Method Server to input GB18030 characters. Use the zh_CN.UTF8 locale instead. If you have legacy programs or data encoded with GB2312, GBK, or GB18030, and you want to migrate them to RHEL4, you must preprocess them with iconv to convert them to UTF-8 encoding so that the programs can run and data can be displayed properly in RHEL4 with the zh_CN.UTF8 locale.

This limitation is resolved in RHEL4 U3.

RHEL4 and xcin

You might experience hangs with xcin on RHEL4. To resolve the problem, set ICCHECK_DISABLE to YES in the /etc/chinese/xcin/xcinrc file.

64-bit environments only

On RHEL4 with xcin (Traditional Chinese XIM server), you might experience unexpected behavior such as a segementation fault with Java on 64-bit environments (such as AMD64 or zSeries 64-bit platforms). To resolve the problem, upgrade to the latest xcin package.

RHEL4 and IIIMF focus change problems

RHEL4 only.

When using IIIMF (Internet Intranet Input Method Framework) to input DBCS characters, you might encounter focus change problems. The problem occurs when minimizing active input components. After restoring the component, the input method will switch back to SBCS. DBCS must then be manually reactivated.

The following components have this focus change problem:

XIM and the Java Plug-in

RHEL4 and SLES9 only

For Japanese, Chinese, and Korean language users, you cannot use XIM to input your own characters into text components on a Java applet in a Web browser. This limitation occurs because XEmbed requires a fix to the X11 library file. To work around this situation, specify the -Dsun.awt.noxembed=true system parameter to disable XEmbed. You can set this option by using the control panel:

  1. Open the Java Plug-in control panel and go to the Java tab.
  2. Click the View button in the Java Applet Runtime Settings.
  3. Input -Dsun.awt.noxembed=true in the Java Runtime Parameters and click OK.
  4. Click Apply.
  5. Start a browser.

This limitation is resolved in RHEL4 U3 and SLES9 SP3.

Arabic characters and Matrox video cards

Intel 32-bit platforms only

For Arabic text users, when using Linux with a Matrox video card and acceleration enabled, distortion of characters can be seen when using drawString to display large fonts. This problem is caused by the driver for those cards. The suggested workaround is to disable acceleration for the device.

SLES9 NPTL and the parallel port driver

Intel 32-bit platforms only

On SLES 9 NPTL, the parallel port driver causes a kernel crash and brings down a Java thread. The JVM detects this crash when it tries to suspend the thread for Garbage Collection and then crashes producing a core file and the message "JVMLH030: threads are disappearing when trying to suspend all threads".

SUSE Bugzilla report 47947 is raised against this problem. This bug is fixed in SLES 9 Service Pack 1.

JNI calls with more than eight parameters on PPC platforms

PPC platforms only

If your Java code uses JNI calls, and any specific call has more than eight float or double parameters, your C code must be compiled with the gcc-2.95.3 Free Software Foundation (FSF) level of GNU C Compiler (GCC).

Parallel port operations on SLES9 before SP2

PPC platforms only

The JavaComm package cannot support parallel port operations on the SLES 9 GA and SP1 kernels. This limitation is resolved in the SP2 kernel. The SUSE Bugzilla number is 50028.

Compiling libFileStat.so on PPC 64-bit platforms

PPC 64-bit platforms only

The default gcc cross compiler (version 3.2-49) causes several errors. To generate the shared library libFileStat.so, run:

/opt/cross/bin/powerpc64-linux-gcc -shared -o libFileStat.so -I<SDK_PATH>/include FileStat.c

where <SDK_PATH> is the path to the installed SDK directory.

IPv6 on zSeries platforms

zSeries platforms only

Although the Linux kernel in the current distributions provides support for Internet Protocol version 6 (IPv6), you might encounter problems using it. Support for IPv6 from Java is included in this release, but you are advised to turn off the support with the -Djava.net.preferIPv4Stack=true option on the java command. If you install a kernel that fully supports IPv6, you do not need this option.

xcin on 64-bit zSeries platforms

zSeries 64-bit platforms only

The Chinese and Taiwanese input method server (xcin) has not been tested.

Java Desktop API

The Java Desktop API might not work because one or more GNOME libraries are not available.

NullPointerException with the GTK Look and Feel

DBCS environments only

If your application fails with a NullPointerException using the GTK Look and Feel, unset the GNOME_DESKTOP_SESSION_ID environment variable.

Unicode Shift_JIS codepage alias

Japanese users only

The unicode codepage alias "\u30b7\u30d5\u30c8\u7b26\u53f7\u5316\u8868\u73fe" for Shift_JIS has been removed. If you use this codepage in your applications, replace it with Shift_JIS.

Notices

This information was developed for products and services offered in the U.S.A. IBM may not offer the products, services, or features discussed in this document in other countries. Consult your local IBM representative for information on the products and services currently available in your area.

Any reference to an IBM product, program, or service is not intended to state or imply that only that IBM product, program, or service may be used. Any functionally equivalent product, program, or service that does not infringe any IBM intellectual property right may be used instead. However, it is the user's responsibility to evaluate and verify the operation of any non-IBM product, program, or service.

IBM may have patents or pending patent applications covering subject matter in this document. The furnishing of this document does not give you any license to these patents. You can send license inquiries, in writing, to:

For license inquiries regarding double-byte (DBCS) information, contact the IBM Intellectual Property Department in your country or send inquiries, in writing, to:

The following paragraph does not apply to the United Kingdom or any other country where such provisions are inconsistent with local law:

INTERNATIONAL BUSINESS MACHINES CORPORATION PROVIDES THIS PUBLICATION "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Some states do not allow disclaimer of express or implied warranties in certain transactions, therefore, this statement may not apply to you.

This information could include technical inaccuracies or typographical errors. Changes are periodically made to the information herein; these changes will be incorporated in new editions of the information. IBM may make improvements and/or changes in the product(s) and/or the program(s) described in this information at any time without notice.

Any references in this information to non-IBM Web sites are provided for convenience only and do not in any manner serve as an endorsement of those Web sites. The materials at those Web sites are not part of the materials for this IBM product and use of those Web sites is at your own risk.

IBM may use or distribute any of the information you supply in any way it believes appropriate without incurring any obligation to you.

Licensees of this program who wish to have information about it for the purpose of enabling (i) the exchange of information between independently created programs and other programs (including this one) and (ii) the mutual use of the information which has been exchanged, should contact:

Such information may be available, subject to appropriate terms and conditions, including in some cases, payment of a fee.

The licensed program described in this document and all licensed material available for it are provided by IBM under terms of the IBM Customer Agreement, IBM International Program License Agreement or any equivalent agreement between us.

Any performance data contained herein was determined in a controlled environment. Therefore, the results obtained in other operating environments may vary significantly. Some measurements may have been made on development-level systems and there is no guarantee that these measurements will be the same on generally available systems. Furthermore, some measurement may have been estimated through extrapolation. Actual results may vary. Users of this document should verify the applicable data for their specific environment.

Information concerning non-IBM products was obtained from the suppliers of those products, their published announcements or other publicly available sources. IBM has not tested those products and cannot confirm the accuracy of performance, compatibility or any other claims related to non-IBM products. Questions on the capabilities of non-IBM products should be addressed to the suppliers of those products.

All statements regarding IBM's future direction or intent are subject to change or withdrawal without notice, and represent goals and objectives only.

Trademarks

IBM, the IBM logo, and ibm.com are trademarks or registered trademarks of International Business Machines Corporation in the United States, other countries, or both. If these and other IBM trademarked terms are marked on their first occurrence in this information with a trademark symbol (® or ™), these symbols indicate U.S. registered or common law trademarks owned by IBM at the time this information was published. Such trademarks may also be registered or common law trademarks in other countries. A current list of IBM trademarks is available on the Web at "Copyright and trademark information" at http://www.ibm.com/legal/copytrade.shtml.

Intel is a trademark of Intel Corporation in the United States, other countries, or both.

Linux is a trademark of Linus Torvalds in the United States, other countries, or both.

UNIX is a registered trademark of The Open Group in the United States and other countries.

Java and all Java-based trademarks and logos are trademarks or registered trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.

Other company, product, or service names may be trademarks or service marks of others.