Before using this information and the product it supports, read the information in Notices.
This edition of the user guide applies to the IBM 32-bit SDK for AIX, Java Technology Edition, Version 6, and to all subsequent releases, modifications, and Service Refreshes, until otherwise indicated in new editions.
© Copyright Sun Microsystems, Inc. 1997, 2007, 901 San Antonio Rd., Palo Alto, CA 94303 USA. All rights reserved.
This user guide provides general information about the IBM® 32-bit SDK for AIX®, 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.
The software that is contained in this release can be used only on AIX Version 5.3 or later. It is not supported, and does not work, on earlier versions of the AIX operating system. See AIX Environment for further details of requirements on the AIX operating system for this release.
Useful Web sites include:
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, by blue chevrons
and in red when viewing in HTML, or by vertical bars to the left of
the changes when viewing as a PDF file.
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.
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).
In general, any applet or application that ran with a previous version of the SDK should run correctly with the IBM 32-bit SDK for AIX, 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.
From Version 5.0, the IBM Runtime Environment for AIX 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:
The IBM 32-bit SDK for AIX, v6, runs on AIX v5.3 Maintenance Package AIX 5300-07 or later, or AIX v6.1.
The latest service details and resources can be found here:http://www.ibm.com/developerworks/java/jdk/aix/service.html
To test whether this Java v6 SDK is supported on a specific System p® system, at the system prompt type:
lscfg -p | fgrep Architecture
You should receive the reply:
Model Architecture: chrp
Only "Common Hardware Reference Platform" (chrp) systems are supported by this SDK.
The environment variable LDR_CNTRL=MAXDATA is not supported for 64-bit processes. Only use LDR_CNTRL=MAXDATA on 32-bit processes.
If you are using one of the supported non-UTF8 CJK locales, you must install one of the following filesets (the installation images are available on the AIX base CDs; updates are available from the AIX fix distribution Web site:
X11.fnt.ucs.ttf (for ja_JP or Ja_JP) X11.fnt.ucs.ttf_CN (for zh_CN or Zh_CN) X11.fnt.ucs.ttf_KR (for ko_KR) X11.fnt.ucs.ttf_TW (for zh_TW or Zh_TW)
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 documentation package is designed to be extracted into the SDK software installation directory. If you download the compressed version, be sure to preserve the path names when you extract the files from the archive.
A list of classes, tools, and other files that you can use with the standard Runtime Environment.
A list of tools and reference information that is included with the standard SDK.
The License file, /usr/swlag/<locale>/Java6.la, contains the license agreement for the SDK for AIX 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.
The IBM 32-bit SDK for AIX, v6 complete release consists of several installp image files (packages). Each installp image file or package contains one or more related filesets. You can install the packages using the smit or smitty system management tools. Alternatively, you can use the installp command.
This package is required:
These packages are optional:
$LANG is one of the following locales. These packages do not include any files but pull in required Unicode TrueType fonts, if not already installed, for these locales:
The SDK is installed in the directory:
/usr/java6/
The following user-configurable files are installed to /etc/java6/ to support a configuration where the files are not shared:
There are symbolic links in /usr/java6/ pointing to the files in /etc/java6/.
By default, the SDK is installed in /usr/java6/. To install the SDK in another directory, use the AIX relocation commands. This feature is supported from IBM SDK for Java Version 5, SR 7 onwards.
Delete any .toc files in the directory containing your installp images or PTFs before using the AIX relocation commands.
See the AIX man pages for more information about the command-line options for these commands.
installp_r -a -Y -R /<Install Path>/ -d '.' Java6.sdkRemove the SDK:
installp_r -u -R /<Install Path>/ Java6.sdk
lsutil
lslpp_r -R /<Install Path>/ -S [A|O]
rmusil -R /<Install Path>/
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.
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.
To help ensure that the verification process behaves consistently, first:
unset LIBPATH unset CLASSPATH unset JAVA_COMPILER unset JAVA_HOME export PATH=/usr/java6/jre/bin:/usr/java6/bin:$PATH
If you issue the command:
java -version
you should see:
java version "1.6.0-internal" Java(TM) SE Runtime Environment (build 20070405_01) IBM J9 VM (build 2.4, J2RE 1.6.0 IBM J9 2.4 AIX ppc-32 jvmap3260-20070326_12091 (JIT enabled) J9VM - 20070326_12091_BHdSMR JIT - dev_20070326_1800 GC - 20070319_AA)
where dates, times, and specific build numbers might be different.
When verification is complete, log on again and review for possible conflicts any values that you might have assigned to these variables.
Unless .hotjava already existed, executing the applet viewer creates a directory called .hotjava in your home directory. Issuing the command:
ls -a ~
should confirm that the directory has been created.
If you alter the PATH environment variable, you will override any existing Java launchers in your path.
The PATH environment variable enables AIX to find programs and utilities, such as javac, java, and javadoc tool, 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:
export PATH=/usr/java6/bin:/usr/java6/jre/bin:$PATH
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
The class path tells the SDK tools, such as java, javac, and the javadoc tool, where to find the Java class libraries.
You should 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.
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.
An overview of the java and javaw commands.
The java and javaw tools start 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 window with error information if it fails.
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 ... ]
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.
java -versionYou will see information similar to:
java version "1.6.0-internal" Java(TM) SE Runtime Environment (build pap3260-20070913_01) IBM J9 VM (build 2.4, J2RE 1.6.0 IBM J9 2.4 AIX ppc-32 jvmap3260-20070905_13799 (JIT enabled) J9VM - 20070905_013799_bHdSMR JIT - r9_20070903_1330 GC - 20070830_AA)Exact build dates and versions will change.
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:
... /usr/java6/jre/lib/ext/ibmpkcs11impl.jar VERSION: 1.0 build_20070125 /usr/java6/jre/lib/ext/dtfjview.jar /usr/java6/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.
You can specify Java options and system properties on the command line, by using an options file, or by using an environment variable.
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.
java -Dmysysprop1=tcpip -Dmysysprop2=wait -Xdisablejavadump MyJavaClass
export IBM_JAVA_OPTIONS="-Dmysysprop1=tcpip -Dmysysprop2=wait -Xdisablejavadump"
The definitions for the standard options.
See JVM command-line options for information about nonstandard (-X) options.
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.
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 LIBPATH environment variable tells AIX applications, such as the JVM, where to find shared libraries when they are located in a different directory from the directory that is specified in the header section of the program.
For example, the header section of the java command is as follows:
> dump -H /usr/java6/jre/bin/java /usr/java6/jre/bin/java: ***Loader Section*** Loader Header Information VERSION# #SYMtableENT #RELOCent LENidSTR 0x00000001 0x0000003f 0x0000006d 0x00000090 #IMPfilID OFFidSTR LENstrTBL OFFstrTBL 0x00000006 0x00000b24 0x00000099 0x00000bb4 ***Import File Strings*** INDEX PATH BASE MEMBER 0 /usr/lib:/lib 1 libc.a shr.o 2 libC.a shr.o 3 libpthreads.a shr_comm.o 4 libpthreads.a shr_xpg5.o 5 libbsd.a shr.o
Index 0 (in bold above) contains the list of directories that are searched for shared objects if LIBPATH is not specified. If LIBPATH is set, the specified directories are searched for shared objects before those listed in Index 0 of the header.
The shared libraries for the SDK are in /usr/java6/jre/lib/ppc/ and /usr/java6/jre/lib/ppc/j9vm. The SDK's Java launcher programs (for example, java, javac, jar) automatically search these directories. If Java is installed as an AIX file set, the parent directory is /usr/java6/, but packages that bundle Java might use different directories. This path is already set by the Java launcher programs such as java, javac, or jar.
Set the LIBPATH if either of the following conditions applies:
The LDR_CNTRL environment variable controls the way AIX handles the memory space available to a 32-bit program and the page sizes used in each segment. The POWER4™ and later PowerPC® processors support the use of 16 MB large pages in addition to the default 4 KB pages. The POWER5+™ and later PowerPC processors add support for two new page sizes, 64 KB and 16 GB.
The SDK typically sets appropriate LDR_CNTRL=MAXDATA settings automatically for the size of the Java heap. However, if you explicitly set the LDR_CNTRL=MAXDATA environment variable the SDK will not override the value you have specified. Do not override the automatic settings unless you have a complete understanding of the AIX memory models. For more information about the AIX memory models and the automatic settings used by the SDK, see SDK use of AIX large program support.
AIX v5.2 and later operating systems support 16 MB pages. AIX v5.3 maintenance package 5300-04 on POWER5+ processors adds support for the 64 KB and 16 GB page sizes. The 16 MB and 16 GB pages require AIX system configuration changes. For information on using 16 MB pages with AIX, see http://www.ibm.com/servers/aix/whitepapers/large_page.html. For information about using either 64 KB or 16 GB pages with AIX, see http://www.ibm.com/servers/aix/whitepapers/multiple_page.pdf. The default AIX page size is 4 KB.
The LDR_CNTRL=LARGE_PAGE_DATA environment variable can be used under the AIX v5.2 and later operating systems to control the use of 16 MB pages for the native data area and native heap of a program. You can use 16 MB large pages, if they are available, by setting LDR_CNTRL=LARGE_PAGE_DATA=Y. Using large pages might improve the performance of Java applications that require a large amount of native heap space. In particular, the native heap is used for machine code generated by the just-in-time compiler and Java applications with a large number of compiled methods might benefit from using 16 MB pages for the native heap.
AIX v5.3 maintenance package 5300-04 added LDR_CNTRL variants that independently control the use of different page sizes for the text (TEXTPSIZE), stack (STACKPSIZE) and native data or heap (DATAPSIZE) areas. See the Guide to Multiple Page Size Support on AIX 5L Version 5.3 for general information about these variants: http://www.ibm.com/servers/aix/whitepapers/multiple_page.pdf.
An example of the use of TEXTPSIZE, STACKPSIZE, and DATAPSIZE variants is:
LDR_CNTRL=TEXTPSIZE=4K@STACKPSIZE=64K@DATAPSIZE=64K
This example uses 4 KB pages for text, 64 KB pages for stack and 64 KB pages for the native data and native heap areas. A DATAPSIZE setting will override any LARGE_PAGE_DATA setting.
In the default AIX 5L™ 32-bit process address space model, the initial thread stack size and data of a process are located in the same PowerPC 256 MB segment. Only one page size can be used in a segment. If different page sizes are specified for the stack and data of a standard 32-bit process, the smaller page size will be used for both. See the Guide to Multiple Page Size Support on AIX 5L Version 5.3 for information about how to use different segments for the stack and data of a process: http://www.ibm.com/servers/aix/whitepapers/multiple_page.pdf.
When page sizes are set using LDR_CNTRL, the SDK does not automatically set MAXDATA and it is set to MAXDATA=0. To use a Java heap larger than 2.5 GB, set MAXDATA to a different value. See SDK use of AIX large program support for more information about possible settings. For example:
LDR_CNTR=MAXDATA=0XB0000000@DSA@TEXTPSIZE=4K@STACKPSIZE=64K@DATAPSIZE=64K
The new 64 KB pages are general-purpose and most workloads will see a benefit by using 64 KB pages for text, stack, native data, and the Java heap. The 16 GB pages are intended only for use in very high performance environments.
For more information about using the LDR_CNTRL environment variables and on configuring AIX support for large pages, see http://www.ibm.com/servers/aix/whitepapers/large_page.html for AIX v5.2 information on 16 MB pages, and http://www.ibm.com/servers/aix/whitepapers/multiple_page.pdf for information on AIX v5.3 support of 64 KB and 16 GB pages.
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.
The JIT is included in both the IBM SDK and Runtime Environment, which is enabled by default in user applications and SDK tools. Typically, you do not start 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.
The Stack Execution Disable (SED) feature in the AIX 5300-03 Recommended Maintenance package stops code from executing in data areas (Power4 and later). For more information about this feature and how it affects the SDK, see AIX Stack Execution Disable.
For more information about the JIT, see the Diagnostics Guide.
The JIT can be disabled in a number of different ways. Both command-line options override the JAVA_COMPILER environment variable.
Turning off the JIT is a temporary measure that can help isolate problems when debugging Java applications.
export JAVA_COMPILER=NONE
java -Djava.compiler=NONE <class>
java -Xint <class>
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.
export JAVA_COMPILER=jitcIf the JAVA_COMPILER environment variable is an empty string, the JIT remains disabled. To disable the environment variable, at the prompt, enter:
unset JAVA_COMPILER
java -Djava.compiler=jitc <class>
java -Xjit <class>
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)
For more information about the JIT, see the Diagnostics Guide.
The Garbage Collector manages the memory used by Java and by applications running in 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.
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:
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.
The subpool option of -Xgcpolicy provides additional throughput optimization for large SMP systems (24- to 64-way).
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.
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.
System resources, for instance memory and CPUs, can be dynamically added to or removed from a logical partition (LPAR) running AIX. Java applications can take advantage of any new resources. Java applications can also respond to DLPAR events using extensions to the java.lang.management API.
If you run Java applications on a single CPU LPAR and never dynamically add a CPU to that LPAR while those Java applications are running, you can improve the performance (results vary depending on the execution characteristics of your application) by exporting the following environment variable: export NO_LPAR_RECONFIGURATION=1. Do not export this environment variable unless you can guarantee all of the following:
Resource changes are effective immediately, so AIX does not have to be rebooted. If an administrator decreases the number of CPUs or memory allocated to an LPAR, the performance of any running SDK application might degrade.
For more information, see http://www.ibm.com/servers/eserver/pseries/hardware/whitepapers/dlpar.html and the article: Dynamic reconfiguration: Basic building blocks for autonomic computing on IBM pSeries® servers in the following IBM Systems Journal issue: http://www.research.ibm.com/journal/sj42-1.html.
To enable applications to respond to DLPAR events, the Java v6 SDK includes IBM-specific extensions to java.lang.management that provide a Java interface to query various LPAR-specific information and listen for events indicating that the JVM's logical partition has been dynamically altered. The Javadoc for this API is provided with the SDK in the docs/content/apidoc directory.
The launcher option, -Xsoftmx, is also available with the Java 6 SDK. The -Xmx option specifies the maximum size (hard limit) of the Java heap. The -Xsoftmx option specifies a lower initial maximum heap size (a "soft" limit). You can change the value of -Xsoftmx at runtime using the java.lang.management API. The valid range of values is between the minimum heap size (-Xms) and the hard limit (-Xmx).
For example, if the JVM is running in an LPAR with 2 GB of memory available for the heap, but the amount of memory might be changed to as low as 1 GB or as high as 8 GB during the run, a suitable set of command-line options might be:
-Xms1g -Xsoftmx2g -Xmx8g
The value of -Xms must be less than or equal the value of -Xsoftmx. If unspecified, -Xsoftmx defaults to the value of -Xmx.
IBM AIX Workload Partitions (WPARs) are software-created, virtualized operating system environments in a single instance of the AIX operating system. To most applications, the workload partition appears to be a separate instance of AIX. Applications in workload partitions have a private execution environment.
Applications in workload partitions are isolated in terms of process and signal, and can be isolated in file system space. Workload partitions can have their own unique users and groups. Workload partitions have dedicated network addresses and interprocess communication (IPC) is restricted to processes running in the same workload partition.
There are two forms of workload partitions:
You can configure either WPAR type for mobility, which allows you to move running WPAR instances between physical systems using the AIX Workload Manager.
From Version 6 Service Refresh 1, the IBM SDK for Java supports WPAR mobility. The IBM SDK for Java can also respond to WPAR mobility events and use system environment changes in the same way as when a DLPAR is reconfigured. See Dynamic Logical Partitioning (DLPAR) support for more information.
For more information about WPAR, see http://www.ibm.com/servers/eserver/pseries/hardware/whitepapers/dlpar.html.
The IBM 32-bit SDK for AIX, v6 uses the IPv6 extensions to the TCP/IP protocol by default.
If you do not want to use IPv6 protocols, you can set the property java.net.preferIPv4Stack to force the use of IPv4 protocols.
The IBM SDK includes enhanced BiDirectional support.
For more information, see http://www.ibm.com/developerworks/java/jdk/additional/JAVABIDI.html.
The Javadoc file for the BiDirectional package is provided with the SDK in the docs/content/apidoc directory.
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.
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.
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.
java -Djava.ext.dirs=/usr/java6/jre/lib/ext:/usr/java6/jre/lib/im <class>
If you installed the SDK or Runtime Environment in a different directory, replace /usr/java6/ with the directory in which you installed the SDK or Runtime Environment.
To increase the maximum number of threads your system can support, lower the maximum native stack size using the -Xss<size> option.
The default native stack size is 512 KB. A smaller setting allows for a larger number of threads. For example:
java -Xss<size> <other params>
To increase the maximum number of file descriptors your system can support, use the ulimit or chuser commands, for example:
ulimit -n 3000
or
chuser nofiles=3000 <user_id>
Use ulimit -a to show the current limit.
The memory space available to a 32-bit program is broken up by AIX into 16 segments of 256 MB each. The AIX memory model being used by a program determines how those segments can be used by the program. In particular, the memory model determines how many segments are available to the native heap and how many segments are available for other purposes.
The AIX memory model is controlled by the LDR_CNTRL=MAXDATA environment variable. For more details on the AIX memory models, see the "Large Program Support" section of the AIX 5.2 "General Programming Concepts: Writing and Debugging Programs" manual available at:
http://publib16.boulder.ibm.com/pseries/en_US/aixprggd/genprogc/genprogctfrm.htm
The document linked above provides information about using the address-space models to accommodate programs requiring data areas that are larger than conventional segmentation can handle. The SDK uses AIX's large program support by automatically setting the LDR_CNTRL=MAXDATA environment variable as appropriate for allocating the Java heap.
The SDK needs space in both the native heap (for non-object allocations such as for thread stacks or JIT buffers), and space that can be used for the Java heap. In almost all instances, the automatic settings of LDR_CNTRL=MAXDATA will be adequate. In certain instances a user might want to override the automatic settings and manually use an explicit LDR_CNTRL=MAXDATA setting. If an explicit setting is used, the SDK does not attempt to change it. Suboptimal settings for a particular Java application can result in out of memory errors when you run the application, and typically indicates that you should change the automatic or manual setting in use.
The automatic setting of the LDR_CNTRL=MAXDATA environment variable value is linked to the size of the Java heap used by the SDK. To simplify the setting of LDR_CNTRL=MAXDATA, the SDK sets an appropriate value that is based on the maximum size of the heap.
If LDR_CNTRL=MAXDATA is set before you start the SDK, the SDK uses the specified value. Otherwise, the SDK uses the following algorithm to set LDR_CNTRL=MAXDATA:
Here is a picture of the memory layout with MAXDATA=0xA0000000@DSA, used for Java heaps up to 2.25 GB:
Segment | Contents |
---|---|
0 | AIX kernel |
1 | Java program |
2 | Primordial Stack (main program thread stack) |
3 | Native Heap (malloc'ed space) |
4-C | Native Heap (malloc'ed space) or Memory Mapped space (mmap/shmat) |
D | Shared library code |
E | Memory Mapped space (mmap/shmat) |
F | Shared library data |
Segments 0 and 1 have a fixed usage; segment 0 is always used for the AIX kernel and segment 1 is always used for the application program code. In this case, the application program code is generally the java executable.
The setting of MAXDATA=0xA0000000@DSA has determined the usage of the other segments as follows:
The Java heap is allocated by the JVM using the AIX mmap or shmget/shmat functions. The mmap function is used when the Java heap is allocated in normal 4 KB pages, shmget/shmat is used when the -Xlp option specifies that large pages are to be used.
It is clear from this memory layout that some Java applications can have problems when using large Java heaps. If a Java heap of 2.25 GB is used, the native heap is restricted to a single 256 MB segment. If the Java application created many threads, for example, it might consume a large fraction of the native heap for thread stacks, which can make the JVM or JIT run out of native heap space. Such a situation requires more careful consideration of what size of Java heap should be used, and might motivate the use of an explicit MAXDATA setting.
For a Java heap larger than 2.25 GB, a different MAXDATA setting is needed to free up additional segments for a contiguous area big enough for the heap. With the MAXDATA=0xB0000000@DSA automatic setting, the memory layout changes to:
Segment | Contents |
---|---|
0 | AIX Kernel |
1 | Java program |
2 | Primordial stack (main program thread stack) |
3 | Native Heap (malloc'ed space) |
4-D | Native Heap (malloc'ed space) or Memory Mapped space (mmap/shmat) |
E-F | Memory Mapped space (mmap/shmat) |
Segments 0 and 1 are fixed in their usage. The setting of MAXDATA=0xB0000000@DSA has determined the usage of the other segments as follows:
Using a maximum sized 3 GB heap places restrictions on the native heap memory available to the JVM and JIT. In this case, there is the additional restriction that the shared libraries must coexist with the native heap.
For a Java heap larger than 3 GB, the only option is to use MAXDATA=0@DSA, resulting in a memory layout as follows:
Segment | Contents |
---|---|
0 | AIX kernel |
1 | Java program |
2 | Native Heap (malloc'ed space) and Primordial Stack (main invocation stack) |
3-F | Memory Mapped space (mmap/shmat) |
The Java heap in this case consumes all of segments 3 through F, for a maximum size of 3.25 GB. The primordial stack, native heap, and shared libraries are all packed into segment 2. It is doubtful that many Java applications could successfully run in this configuration.
Use the LDR_CNTRL=MAXDATA environment variable to enable memory layouts that are different from the automatic settings.
One interesting setting is MAXDATA=0:
Segment | Contents |
---|---|
0 | AIX kernel |
1 | Java program |
2 | Primordial Stack (main program thread stack) and Native Heap |
3-C | Memory Mapped space (mmap/shmat) |
D | Shared library code |
E | Memory Mapped space (mmap/shmat) |
F | Shared library data |
The setting of MAXDATA=0 has determined the usage of the segments as follows:
AIX 5300-03 implements Buffer Overflow Protection (BOP) using Stack/heap Execution Disable (SED). SED prevents buffer overflow attacks by not executing code in data areas of memory. AIX system administrators control the way SED is used. Java JIT implementations generate machine code in C heap memory; therefore, Java launchers must be exempt from SED.
You make programs exempt from SED by setting the XCOFF executable file header flag DEP_EXEMPT. All Java launchers have the appropriate bit set to exempt them from the SED feature.
Applications that use their own Java launchers and create JVM instances using JNI must be explicitly patched to exempt them from SED. Use the sedmgr utility and verify the change using the dump or sedmgr utility.
The syntax for using these utilities is:
sedmgr -c exempt <launcher> dump -ov <launcher>
For more details on SED, see http://publib.boulder.ibm.com/infocenter/pseries/index.jsp.
The SDK for AIX contains many tools and libraries required for Java software development.
See Contents of the SDK for details of the tools available.
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.
The IBM SDK for Java contains the following XML libraries:
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 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.
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:
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:
The following service providers control the XML processing libraries used by Java:
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.
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 compilation and optimization reduce performance.
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.
Some generated functions exceeded the JVM method size limit and were automatically split into smaller functions. You might get better performance by manually splitting very large templates into smaller templates, by using the 'splitlimit' option to the Process or Compile command, or by setting the 'http://www.ibm.com/xmlns/prod/xltxe-j/split-limit' transformer factory attribute.
You can use the compiled classes, but you might get better performance by controlling the split limit manually.com.ibm.xtq.bcel.generic.ClassGenException: Branch target offset too large for short
orbytecode array size > 65535 at offset=#####
Try setting the split limit manually, or using a lower split limit.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 |
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 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.
The following optional StAX features are not supported by XL XP-J:
The javax.xml.stream.XMLInputFactory implementation supports the following properties, as described in the XMLInputFactory Javadoc information: http://java.sun.com/javase/6/docs/api/javax/xml/stream/XMLInputFactory.html.
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.
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.
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.
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.
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.
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.
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 is an XSLT library containing the XSLT4J 2.7.8 interpreter and a XSLT 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 |
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.
To avoid this situation, use one of the following workarounds:
export IBM_JAVA_OPTIONS=-Djavax.xml.parsers.SAXParserFactory= org.apache.xerces.jaxp.SAXParserFactoryImplor
export IBM_JAVA_OPTIONS=-Djavax.xml.parsers.DocumentBuilderFactory= org.apache.xerces.jaxp.DocumentBuilderFactoryImplor
export IBM_JAVA_OPTIONS=-Djavax.xml.transform.TransformerFactory= org.apache.xalan.processor.TransformerFactoryImpl
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 the operating system.
The SDK includes a Plug-in for the AIX debugger DBX. Although the DBX Plug-in is supplied as part of the SDK, it is not supported. However, IBM will accept bug reports.
More information about problem diagnosis using Java can be found in the Diagnostics Guide.
The Java Debugger (JDB) is included in the SDK for AIX. The debugger is started with the jdb command; it attaches to the JVM using JPDA.
To debug a Java application:
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=<port> <class>The JVM starts up, but suspends execution before it starts the Java application.
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:
You can also use JDB to debug Java applications running on remote workstations. JPDA uses a TCP/IP socket to connect to the remote JVM.
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=<port> <class>The JVM starts up, but suspends execution before it starts the Java application.
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:
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.
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.
import com.ibm.jvm.Debuggable;
@Debuggable public int method1() { ... }
@Debuggable public class Class1 { ... }
Applications will run faster while being debugged because the core Java API and any IDE code can be optimized for performance.
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.
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 inside your application code using the call:
System.getProperty("com.ibm.vm.bitmode");
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 interrupt signals, the JVM also enters a controlled shutdown sequence, but this time it is treated as a normal termination that:
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 stop. The only control signal of interest is SIGQUIT, which causes a Javadump to be generated.
The types of signals are Exceptions, Errors, Interrupts, and Controls.
Table 7 shows the signals that are used by the JVM. The signals are grouped in the table by type or use, as follows:
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 call an unknown machine instruction) | Yes |
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 | By default, this triggers a Javadump. | Yes |
No Name (40) | Control | An AIX reserved signal. Used by the AIX JVM for internal control purposes. | Yes |
SIGRECONFIG (58) | Control | Reserved to detect any change in the number of CPUs, processing capacity, or physical memory. | 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.
Do not use the -qflttrap C compiler setting because it provides the possibility of SIGTRAPs being generated, which might then impact the JIT. If you want to have floating point exceptions generated, include this call in your code so that it generates a SIGFPE signal:
fp_trap( FP_TRAP_SYNC)
If you install a signal handler for signal numbers 5 (SIGTRAP) or 58 (SIGRECONFIG), you impact JVM performance because these signals are used for internal control purposes.
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.
The Runtime Environment contains signal-chaining. Signal-chaining enables the JVM to interoperate more efficiently with native code that installs its own signal handlers.
The libjsig.a 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.a 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.
The environment variable JAVA_HOME should be set to the location of the SDK, for example,/usr/java6/.
To use libjsig.a:
cc_r <other compile/link parameter> -L/usr/java6/jre/bin -ljsig -L/usr/java6/jre/bin/j9vm -ljvm java_application.c
Valid Java Native Interface (JNI) version numbers that programs can specify on the JNI_CreateJavaVM() API call are: JNI_VERSION_1_2(0x00010002) and JNI_VERSION_1_4(0x00010004).
This version number determines only the level of the JNI to use. The actual level of the JVM that is created is specified by the JSE libraries (that is, v6). The JNI level 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.
The IBM XL C compiler V6.0.0.0 is supported for AIX 32-bit on PowerPC.
There is a readme file and example programs in the /usr/java6/demo/jni directory. The demos can be optionally installed with the Java6.samples package.
If you are writing a C or C++ program that uses the JNI Invocation API (that is, the program creates a Java Virtual Machine and calls Java code), you might want to ensure that the following variables are set appropriately. By default, all the Java launchers that are shipped with the SDK (for example, java, jar) set up these environment variables to the values that are specified as follows:
When you build a C or C++ program that uses the invocation API, your LIBPATH must include the directories containing the JVM's shared libraries, /usr/java6/jre/lib/ppc/ and /usr/java6/jre/lib/ppc/j9vm, as well as the directories that contain the application's shared libraries.
You must build:
The SDK does not support runtime linking (using the -brtl loader option). Any applications that are built for use with the SDK must not rely on runtime linking functionality.
You are recommended to compile your native methods (C or C++ functions called by Java) into AIX shared objects (dynamically loaded libraries). For example, if your native methods are stored in the file nm.c, you could create the shared object with the following command:
cc_r -qmkshrobj -qarch=ppc -I /usr/java6/include -o libnm.a nm.cThe -qmkshrobj option disables runtime linking. For more details about shared object files, runtime linking, and the use of cc and ld command-line options, see:
Before running a Java program that uses native methods, ensure that LIBPATH contains the list of directories that are holding the native methods' shared objects. For more information about building AIX shared objects, see C and C++ Application Development on AIX. Go to http://www.ibm.com/redbooks and search for "SG245674".
If you set the setuid or setgid attribute on JNI native code programs, that setting changes the effective LIBPATH environment variable. This change might cause unexpected or incorrect behavior with those programs. For more details about this usage, see Developing and Porting C and C++ Applications on AIX at http://www.redbooks.ibm.com/abstracts/sg245674.html, section 2.3.3.
When building a C or C++ program that uses the JNI Invocation API to create a Java virtual machine and calls Java code, use the:
For example, this command builds a C program (invAPITest.c) that uses the JNI Invocation API:
cc_r -qarch=ppc -I/usr/java6/include -o invAPITest -L/usr/lib -L/lib -L/usr/java6/jre/lib/ppc/j9vm -L/usr/java6/jre/lib/ppc/ -ljvm invAPITest.c
When executing a C or C++ program that uses the JNI Invocation API to run Java classes, ensure that the class path is set up correctly to enable the Java Virtual Machine (JVM) to find your class files. If you modify Java's boot class path, include the SDK files that are necessary to run your applications.
To determine whether a C or C++ program that is using the JNI Invocation API was built with the -bM:UR option, use the command:
>dump -ov <program name> ***Object Module Header*** # Sections Symbol Ptr # Symbols Opt Hdr Len Flags 4 0x00000d4e 155 72 0x1002 Flags=( EXEC DYNLOAD ) Timestamp = "Sep 11 13:09:13 2002" Magic = 0x1df (32-bit XCOFF) ***Optional Header*** Tsize Dsize Bsize Tstart Dstart 0x000004b8 0x000001a8 0x00000004 0x10000128 0x200005e0 SNloader SNentry SNtext SNtoc SNdata 0x0004 0x0002 0x0001 0x0002 0x0002 TXTalign DATAalign TOC vstamp entry 0x0002 0x0003 0x20000724 0x0001 0x20000704 maxSTACK maxDATA SNbss magic modtype 0x00000000 0x00000000 0x0003 0x010b UR
If the modtype is not UR, you can use the LDR_CNTRL environment variable to make programs behave as though they were compiled with the -bM:UR binder option. For example:
export LDR_CNTRL=USERREGS
If you need to specify multiple options with LDR_CNTRL, separate those options with the "@" symbol.
Java threads that are created by the SDK use the POSIX pthreads model that is supported on AIX. Currently, this is on a 1-to-1 mapping with the kernel threads. When developing a JNI program, you must run with a 1-to-1 thread model and system contention scope if creating pthreads in your own program. You can control this by using the following environment setting:
export AIXTHREAD_SCOPE=S
Another option is to preset the thread's scope attribute to PTHREAD_SCOPE_SYSTEM using the AIX pthread_attr_setscope function when the thread is created. For more details on thread model and system contention scope, see:
From Java V5.0, you can store native methods in these ways:
Programs can also link dynamically to AIX shared libraries and shared objects using the dlopen() family of subroutines. The SDK links in this way when it loads native libraries (for example, System.load(), System.loadLibrary(), Runtime.getRuntime().load(), Runtime.getRuntime().loadLibrary()).
For information about dlopen, see:
For information about AIX loading and linking mechanisms, see: http://download.boulder.ibm.com/ibmdl/pub/software/dw/aix/es-aix_ll.pdf
To load an AIX shared library, make a call to:
System.loadLibrary("<library>(<member>)")
where <library> is the name of the shared library archive and <member> is the name of an archive member. For example:
System.loadLibrary("libShared.a(libSample.o)")
This example takes you through the process of using native shared libraries with a Java application on AIX.
public class Sample { public native void printFromNative( ); public static void main( String[] args ) { Sample sample = new Sample( ); sample.printFromNative( ); } static { String sharedLibrary = "libShared.a(libSample.o)"; try { System.loadLibrary( sharedLibrary ); } catch ( Exception e ) { System.out.println( "ERROR: Unable to load " + sharedLibrary ); e.printStackTrace( ); } } }
javac Sample.java
javah Sample
#include <stdio.h> #include "Sample.h" JNIEXPORT void JNICALL Java_Sample_printFromNative( JNIEnv * env, jobject obj ) { printf( "Printing from native\n" ); }
cc_r -bM:SRE -bnoentry -bexpall -I/usr/java6/include Sample.c -o libSample.o
ar -X32 -v -q libShared.a libSample.o
LIBPATH=. java SampleThe program will output:
Printing from native
You should now be able to use the same framework to access native shared libraries from Java applications.
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:
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 information for these classes is provided with the SDK in the docs/content/apidoc directory.
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.
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.
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.
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 have 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.
A runtime debug feature provides improved serviceability. You might find it useful for problem diagnosis or it might be requested by IBM service personnel.
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>
Do not enable 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.
The ORB can be tuned to work well with your specific network. The properties required to tune the ORB are described here.
To disable fragmentation, set the fragment size to 0 bytes:
java -Dcom.ibm.CORBA.FragmentSize=0 <myapp>
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.
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 |
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.
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:
Thread pooling for RMI Connection Handlers is not enabled by default.
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.
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.*;.
From AIX 5.3 onwards, programs can set the priority of system contention scope threads. Calls to java.lang.Thread.setPriority() will change the priority of Java threads running on AIX 5.3.
For more information about AIX dynamic thread scheduling, see:
http://publibn.boulder.ibm.com/doc_link/en_US/a_doc_lib/aixprggd/genprogc/threads_sched.htm
For more information about AIX 5.3 thread scheduling, see:
http://publib.boulder.ibm.com/infocenter/pseries/index.jsp?topic=/com.ibm.aix.doc/libs/basetrf1/pthread_setschedparam.htm and http://publib.boulder.ibm.com/infocenter/pseries/index.jsp?topic=/com.ibm.aix.doc/aixprggd/genprogc/threads_sched.htm.
The IBM 32-bit SDK for AIX, v6 provides a unified interface, the Java Naming and Directory Interface (JNDI), to the naming and directory services.
These naming and directory services are supported by JNDI:
The Java Virtual Machine Profiling Interface (JVMPI) has been extended to include profiling in the IBM JIT. These additional definitions are listed in jvmpi.h.
To enable the JVMPI function GetCurrentThreadCPUTime, you must enable AIX resource collection by setting the environment variable AIXTHREAD_ENRUSG.
When the resource collection is enabled, the HPROF profiling agent, started with -Xrunhprof:cpu=times provides meaningful data in the HPROF output.
Type the following command at the shell prompt:
export AIXTHREAD_ENRUSG=ON
You will get the following message when performance profiling is switched on:
Warning: Performance profiling is enabled and can cause performance degradation. Warning: You can unset AIXTHREAD_ENRUSG to disable performance profiling.
Make sure that the resource collection is disabled after your profiling session because the added processor usage when tracking CPU time for individual threads affects performance. Resource collection should never be enabled in a production environment. To disable the resource collection, do one of the following:
unset AIXTHREAD_ENRUSG export AIXTHREAD_ENRUSG=OFF
By default, resource collection is disabled.
The JVMPI_EVENT_INSTRUCTION_START event is not currently supported in the IBM 32-bit SDK for AIX, v6. It might be added in a future release.
The IBM 32-bit SDK for AIX, 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.
Related links:
The Java Attach API allows your application to connect to a virtual machine. Your application can then load an agent application into the virtual machine, for example to perform tasks such as monitoring the virtual machine status.
Code for agent applications, such as JMX agents or JVMTI agents, is normally loaded during virtual machine startup by specifying special startup parameters. This might not be convenient for using agents on applications that are already running, such as WebSphere Application Servers. The late attach capability, using the Java Attach API, lets you load an agent at any time by specifying the process ID of the VM to be connected.
To use the late attach capability, start your applications with the following system property:
-Dcom.ibm.tools.attach.enable=yes
For JMX applications, you might need to disable authentication by editing the <JAVA_HOME>/jre/lib/management/management.properties file. Set the following properties to disable authentication in JMX:
com.sun.management.jmxremote.authenticate=false com.sun.management.jmxremote.ssl=false
An unsuccessful attempt to invoke the Attach API results in one of the following exceptions:
Related links:
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.
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/.
The Java plug-in supports Mozilla.
Browser | Supported Versions |
---|---|
Mozilla | 1.7.13, Available at http://www.ibm.com/servers/aix/browsers/ and the Mozilla for AIX CD. |
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 the browser and plug-in can locate the JVM.
Follow these steps
to make the Java plug-in available
to Mozilla Firefox users:
cd /usr/local/mozilla-firefox/plugins/Note that the directory name is different for different Linux® distributions.
ln -s /opt/ibm/java-<arch>-60/jre/plugin/<arch>/ns7/libjavaplugin_oji.so .Where <arch> is the architecture of your system.
You can change the properties of the Java Plug-in from the control panel, which can be run as a standalone Java application.
To start this Java application, run the script:
/usr/java6/jre/bin/ControlPanel
Information about the Java Plug-in HTML converter, HtmlConverter.
The Java Plug-in HTML converter allows you to convert any HTML page that contains applets to a format that will use the Java Plug-in.
The tool is in the /usr/java6/bin directory with a jar file in the /usr/java6/lib directory.
For more information about the Java Plug-in HTML Converter, see the Sun Web site: http://java.sun.com/javase/6/docs/technotes/guides/plugin/developer_guide/html_converter.html.
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:
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.
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.
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.
Use the following commands to run and debug an applet with the Applet Viewer.
Running applets with the Applet Viewer:
From a shell prompt, enter:
appletviewer <name>
where <name> is one of the following:
For example, to start 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 start 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.
If you use the Applet Viewer to run an applet that is in the CLASSPATH, you might get an AccessControlException in Swing. Because the CLASSPATH implicitly contains the current directory ".", this exception might occur if you run the Java Plug-in in the same directory that the applet class itself is in.
To work around this problem, ensure that:
Java Web Start is used for Java application deployment.
With Web Start, you can start 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 command-line arguments 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 more information about Web Start, see:
For more information about deploying applications, see:
Web Start can be run from a Web page or the command line. Web Start applications are stored in the Java Application Cache.
You can start Web Start in a number of different ways.
javaws <URL>Where <URL> is the location of a .jnlp file.
/usr/java6/jre/bin/javaws -viewer
All Java Web Start applications are stored in the Java Application Cache. An application is downloaded only if the latest version is not in the cache.
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 that 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 usual.
You can disable SSV by setting the deployment.javaws.ssv.enabled property in the deployment.properties file to false.
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 AIX. The SDK for AIX software contains a Runtime Environment. However, you cannot assume that your users have the SDK for AIX software installed.
Your application can either make the SDK for AIX a prerequisite or include a version of the SDK that is specifically for the purpose of redistribution. The SDK for AIX license does not allow you to redistribute any of the SDK files installed in /usr/java6/ by installp. You can redistribute the SDK files in the j632redist.tar or j632redist.tar.gz file (after viewing and agreeing to the associated online license) available from the AIX Java Web site: http://www.ibm.com/developerworks/java/jdk/aix/. Click the Download and service information link near the bottom of the page and follow the links to the Java download page.
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 storage 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 running JVM and persists until it is destroyed.
A shared cache can contain:
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.
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.
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.
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.
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.
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.
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 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.
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:
See the Diagnostics Guide for more information.
An overview of the life-cycle 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.
Class data sharing is particularly useful on systems that use more than one JVM running similar code; the system benefits from reduced virtual storage consumption. It is also useful on systems that frequently start up and shut down JVMs, which benefit from the improvement in startup time.
The processor and memory usage required 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 storage consumption.
Consider these factors when deploying class data sharing in a product and using class data sharing in a development environment.
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.
The virtual address space available to the process is 3.25 GB, depending on your system configuration. See SDK use of AIX large program support.
You cannot run RetransformClasses() on classes loaded from the shared class cache.
The JVM might throw the exception UnmodifiableClassException if you attempt to run RetransformClasses(). It does not work because class file bytes are not available for classes loaded from the shared class cache. If you must use RetransformClasses(), ensure that the classes to be transformed are not loaded from the shared class cache, or disable the shared class cache feature.
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.
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.
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.
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 document 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.
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 usual method of access or on the Web at: http://www.ibm.com/partnerworld/.
If you have purchased a service contract (that is, the IBM 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.
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/.
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.
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 start 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.
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.
You can specify the options on the command line while you are starting Java. They override any relevant environment variables. For example, using -cp <dir1> with the Java command completely overrides setting the environment variable CLASSPATH=<dir2>.
Although the command line is the traditional way to specify command-line options, you can pass options to the JVM in other ways.
Use only single or double quotation marks for command-line options when explicitly directed to do so for the option in question. Single and double quotation marks have different meanings on different platforms, operating systems, and shells. Do not use '-X<option>' or "-X<option>". Instead, you must use -X<option>. For example, do not use '-Xmx500m' and "-Xmx500m". Write this option as -Xmx500m.
These precedence rules (in descending order) apply to specifying options:
For example, java -X<option> MyClass
In the options file, specify each option on a new line; you can use the '\' character as a continuation character if you want a single option to span multiple lines. Use the '#' character to define comment lines. You cannot specify -classpath in an options file. Here is an example of an options file:
#My options file -X<option1> -X<option2>=\ <value1>,\ <value2> -D<sysprop1>=<value1>
For example, set IBM_JAVA_OPTIONS=-X<option1> -X<option2>=<value1>
Use these options to print help on assert-related options, set the search path for application classes and resources, print a usage method, identify memory leaks inside the JVM, print the product version and continue, enable verbose output, and print the product version.
<Loaded java/lang/String from C:\sdk\jre\lib\vm.jar> <Class size 17258; ROM size 21080; debug size 0> <Read time 27368 usec; Load time 782 usec; Translate time 927 usec>
Use the system property command-line options to set up your system.
When a connection is made by an applet to a server and the server does not respond properly, the applet might seem to hang and might also cause the browser to hang. This apparent hang occurs because there is no network connection timeout. To avoid this problem, the Java Plug-in has added a default value to the network timeout of 2 minutes for all HTTP connections. You can override the default by setting this property.
Use these options to configure your JVM. The options prefixed with -X are nonstandard.
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.
Options that relate to the JIT are listed under JIT and AOT command-line options. Options that relate to the Garbage Collector are listed under Garbage Collector command-line options.
Displays callsite information every <number of allocations>. Deallocations are not counted. Callsite information is presented in a table with separate information for each callsite. Statistics include the number and size of allocation and free requests since the last report, and the number of the allocation request responsible for the largest allocation from each site. Callsites are presented as sourcefile:linenumber for C code and assembly function name for assembler code.
Callsites that do not provide callsite information are accumulated into an "unknown" entry.
If you do not request an exact multiple of one page of memory, a region on one side of your memory is not locked. The top and bottom options control which side of the memory area is locked. top aligns your memory blocks to the top of the page, so buffer underruns result in an application failure. bottom aligns your memory blocks to the bottom of the page so buffer overruns result in an application failure.
Standard padding scans detect buffer underruns when using top and buffer overruns when using bottom.
AIX, Linux, and Windows only: If a <size> is specified, the JVM attempts to allocate the JIT code cache memory using pages of that size. If unsuccessful, or if executable pages of that size are not supported, the JIT code cache memory is allocated using the smallest available executable page size.
Specifies a file that contains JVM options and definitions. By default, no option file is used.
The options file does not support these options:
<file> contains options that are processed as if they had been entered directly as command-line options. For example, the options file might contain:
-DuserString=ABC123 -Xmx256MB
Some options use quoted strings as parameters. Do not split quoted strings over multiple lines using the line continuation character '\'. The '¥' character is not supported as a line continuation character. For example, the following example is not valid in an options file:
-Xevents=vmstop,exec="cmd /c \ echo %pid has finished."
The following example is valid in an options file:
-Xevents=vmstop, \ exec="cmd /c echo %pid has finished."
Enables class sharing. This option 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.
You can use the following suboptions with the -Xshareclasses option:
Enables reduction of the memory footprint of Java when concurrently running multiple Java invocations. -Xzero might not be appropriate for all types of applications because it changes the implementation of java.util.ZipFile, which might cause extra memory usage. -Xzero includes the optional parameters:
Because future versions might include more default options, -Xzero options are used to specify the suboptions that you want to disable. By default, -Xzero enables j9zip and sharezip. A combination of j9zip and sharezip enables all jar files to have shared caches:
-Xzero is available only in Java 6 SR1 and beyond. When enabled, the system property com.ibm.zero.version is defined, and has a current value of 1. For Java 6 SR1 and Java 6 SR2, the -Xzero option is accepted only on Windows x86-32 and Linux x86-32 platforms. From Java 6 SR3, -Xzero is accepted on all platforms; however, it is enabled only on Windows x86-32 and Linux x86-32 platforms.
JVM command-line options that are specified with -XX are not stable and are not recommended for casual use.
These options are subject to change without notice.
When this option is enabled, Throwable.getStackTrace() returns an empty array and the stack trace is displayed when an uncaught exception occurs. Thread.getStackTrace() and Thread.getAllStackTraces() are not affected by this option.
Use these JIT and AOT compiler command-line options to control code compilation.
You might need to read the section on JIT and AOT problems in the Diagnostics Guide (http://www.ibm.com/developerworks/java/jdk/diagnosis/60.html) to understand some of the references that are given here.
Use these Garbage Collector command-line options to control garbage collection.
You might need to read the section on "Memory management" in the Diagnostics Guide (http://www.ibm.com/developerworks/java/jdk/diagnosis/60.html) to understand some of the references that are given here.
The -verbose:gc option detailed in the section on "-verbose:gc logging" in the Diagnostics Guide (http://www.ibm.com/developerworks/java/jdk/diagnosis/60.html) is the main diagnostic aid that is available for runtime analysis of the Garbage Collector. However, additional command-line options are available that affect the behavior of the Garbage Collector and might aid diagnostics.
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, you should use a number from 0 to 1, for example, 50% is 0.5.
The default (no compaction option specified) makes the GC compact based on a series of triggers that attempt to compact only when it is beneficial to the future performance of the JVM.
Disables System.gc() calls.
Many applications still make an excessive number of explicit calls to System.gc() to request garbage collection. In many cases, these calls degrade performance through premature garbage collection and compactions. However, you cannot always remove the calls from the application.
The -Xdisableexplicitgc parameter allows the JVM to ignore these garbage collection suggestions. Typically, system administrators use this parameter in applications that show some benefit from its use.
By default, calls to System.gc() trigger a garbage collection.
The optthruput option is the default and delivers very high throughput to applications, but at the cost of occasional pauses. Disables concurrent mark.
The optavgpause option reduces the time that is spent in these 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. Enables concurrent mark.
The gencon option requests the combined use of concurrent and generational GC to help minimize the time that is spent in any garbage collection pause.
The subpool option (AIX, Linux PPC and zSeries, z/OS and i5/OS) 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.
On systems running multiple JVMs or in LPAR environments where multiple JVMs can share the same physical CPUs, you might want to restrict the number of GC threads used by each JVM so that, if multiple JVMs perform garbage collection at the same time, the total number of parallel operation GC threads for all JVMs does not exceed the number of physical CPUs present.
If scavenger is enabled, -Xms >= -Xmn + -Xmo.
If scavenger is disabled, -Xms >= -Xmo.
Examples of the use of -Xms and -Xmx:
Causes -verbose:gc output to be written to the specified file. If the file cannot be found, -verbose:gc tries to create the file, and then continues as normal if it is successful. If it cannot create the file (for example, if an invalid filename is passed into the command), it redirects the output to stderr.
If you specify <X> and <Y> the -verbose:gc output is redirected to X files, each containing Y GC cycles.
The dump agent tokens can be used in the filename. See the Diagnostics Guide (http://www.ibm.com/developerworks/java/jdk/diagnosis/60.html) section on the "Dump agent tokens" for more information. If you do not specify <file>, verbosegc.%Y%m%d.%H%M%S.%pid.txt is used.
By default, no verbose GC logging occurs.
Known limitations on the SDK and Runtime Environment for AIX.
You can find more help with problem diagnosis in the Diagnostics Guide at http://www.ibm.com/developerworks/java/jdk/diagnosis/60.html.
On AIX 5.3, if a class is run using JDI, either directly or through JDB, the class does not return to the starting class.
In the IBM 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 start the application that you want to monitor, set these command-line options:
If new classes are loaded after an Exception has been caught, the stack trace contained in 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.
The IBM 32-bit SDK for AIX, v6 Web Start does not support launching Java 1.3 applications.
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.
AIX 5.3 only
For Japanese, Chinese, and Korean language users, you cannot use XIM to enter your own characters into text components on a Java applet in a Web browser. 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:
This limitation is resolved in APAR IY77834 (AIX5.3).
If you have difficulty with print operations, try increasing the size of the default file system that is used for print spooling to be larger than the printed PostScript® file size.
Text rendering for Java AWT TextField and TextArea components is performed by the AIX rasterizer for X/Motif text widgets. Currently, you might experience text dropouts at small font sizes for some fonts. To avoid the problem, use a font size that is greater than 12 points for AWT TextField and TextArea components.
Chinese and Japanese locales only.
The CapsLock key does not work properly. On Chinese locales, you cannot enter uppercase characters using the keyboard. To resolve the problem, see APAR IY98336.
To use the Java Desktop API you must install the GNOME window manager. See http://java.sun.com/javase/technologies/desktop/ for more information about the Desktop API.
DBCS environments only
If your application fails with a NullPointerException using the GTK Look and Feel, unset the GNOME_DESKTOP_SESSION_ID environment variable.
You must close the candidate window and commit pre-edited strings before you switch the Input Method (IM) using the IM selection menu. If you open the IM selection menu without either closing the candidate window or committing a pre-edited string, cancel the menu, close the candidate window, and commit the pre-edited string, then try to switch the IM again.
DBCS characters might not display correctly in the title of a JFrame. To avoid this problem, set the language in the terminal login screen instead of in a prompt after you have logged in.
Japanese users only
The Unicode code page alias "\u30b7\u30d5\u30c8\u7b26\u53f7\u5316\u8868\u73fe" for Shift_JIS has been removed. If you use this code page in your applications, replace it with Shift_JIS.
Shared classes cache and control files are not compatible between Java 6 SR4 and previous releases.
The Java kernel aims to reduce the startup time imposed by an application when it finds that the installed JRE needs an update. When this situation occurs, the Java kernel automatically downloads only the Java components that are needed directly from the Sun Web site. This automated download is currently not possible with the IBM implementation of this Sun Java update.
The toolkit implements the JavaScript™ DeployJava.js, which can be used to automatically generate any HTML needed to deploy applets and Java Web Start applications. However, this is not possible with the IBM release of Java because the process involves downloading and running the specific JRE from a public site, using public functions.
There are some known limitations relating to Next-Generation Java Plug-In Technology:
The IBM Runtime
Environment for Java contains
an expired GTE CyberTrust Certificate in the CACERTS file
for compatibility reasons. The CACERTS file is
provided as a default truststore. Some common public certificates
are provided as a convenience. If no applications require the
certificate, it can be left in the CACERTS file.
Alternatively, the certificate can be deleted. If applications do
require the certificate, modify them to use the newer GTE CyberTrust
Global root certificate that expires in 2018. This certificate
might be removed for later versions of the SDK.
Expired
GTE Cybertrust Certificate
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.
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.
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.