# IBM 32-bit SDK and Runtime Environment for Windows, Java 2 Technology Edition, Version 5.0

# 用户指南

# 版权信息

注意：在使用本资料及其支持的产品之前，请务必阅读声明中的一般信息。

本版本的《用户指南》适用于 IBM 32-bit SDK and Runtime Environment for Windows, Java 2 Technology Edition, Version 5.0 及所有后续发行版、修订版和服务更新，直到在新版本中另有声明为止。

(c) Copyright Sun Microsystems, Inc. 1997, 2004, 901 San Antonio Rd., Palo Alto, CA 94303 USA. All rights reserved.

(c) Copyright International Business Machines Corporation, 1999, 2005. All rights reserved.

U.S. Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.

# 前言

本《用户指南》提供有关 IBM(R) 32-bit SDK and Runtime Environment for Windows(R), Java(TM) 2 Technology Edition, Version 5.0 的一般信息和有关 IBM 实现与 Sun 实现比较的任何差异的特定信息。请阅读本《用户指南》及以下 Sun Web 站点上的更多详尽文档：http://java.sun.com。

SDK 和 Runtime Environment 在以下产品上受支持：

- Windows 2000
- Windows XP
- Windows Server 2003

请注意 IPv6 只有在 Windows XP 和 Windows Server 2003 上才受支持。

Diagnostics Guide 提供了有关 IBM Virtual Machine for Java 的更详细的信息。

当在 HTML 中或在彩色打印的副本中查看时，为 Version 5.0 对本《用户指南》所作的技术更改（除了一些轻微或明显的更改，例如将“1.4.2”更新为“5.0”）都以红色标出，并在更改的左侧标有竖线。

术语“Runtime Environment”和“Java 虚拟机”在本《用户指南》中是可互换使用的。

# 目录

版权信息
前言
概述
版本兼容性
升级 SDK
从其他 IBM JVM 进行迁移
SDK 和 Runtime Environment 的内容
Runtime Environment 工具
SDK 工具
安装和配置 SDK 与 Runtime Environment
安装前
照管（交互式）安装
安装程序包
安装 Runtime Environment 作为系统 Java 虚拟机
无人照看的安装
启用 IBM Accessibility Bridge
禁用 Java 辅助功能选项支持
适用于欧洲语言用户的信息
设置 PATH
设置 CLASSPATH
卸载
使用 Runtime Environment
选项
指定 Java 选项和系统属性
标准选项
非标准选项
获取 IBM build 和版本号
Java 命令全局化
自动执行 Java 文件
用本机辅助技术运行 Java 应用程序
Just-In-Time（JIT）编译器
禁用 JIT
启用 JIT
确定是否已启用 JIT
指定垃圾收集策略
垃圾回收选项
暂停时间
减少暂停时间
具有很满的堆的环境
JVM 如何处理信号
JVM 所使用的信号
将本机代码驱动程序链接到信号链接库
转换 XML 文档
使用较早版本的 Xerces 或 Xalan
使用 SDK 开发 Java 应用程序
调试 Java 应用程序
Java 调试器（JDB）
确定应用程序是在 32 位 JVM 还是在 64 位 JVM 上运行
编写 JNI 应用程序
处理 applet
使用 Applet 查看器运行 applet
使用 Applet 查看器调试 applet
| |
配置大页面内存分配
CORBA 支持
对 GIOP 1.2 的支持
对可移植拦截器的支持
对可互操作命名服务的支持
用于跟踪 ORB 的系统属性
用于调整 ORB 的系统属性
ORB 的 Java 2 安全许可权
ORB 实现类
RMI over IIOP
实现 RMI 的连接处理程序池
增强的 BiDirectional 支持
增强的 BigDecimal
欧元符号支持
使用 Java Communications API（JavaComm）
安装 Java Communications API
配置 Java Communications API
Java Communications API 的打印局限性
卸载 Java Communications API
Java Communications API 文档
部署 Java 应用程序
使用 Java Plug-in
支持的浏览器
公共文档对象模型（DOM）支持
使用 DBCS 参数
使用 Web Start
运行 Web Start
发布 Java 应用程序
| |
JVM 之间的类数据共享
| |
类共享概述
| |
高速缓存内容
| |
高速缓存的动态更新
| |
启用类共享
| |
高速缓存安全性
| |
高速缓存生存时间
| |
高速缓存实用程序
| |
使用命令行选项控制类共享
| |
创建、植入、监视和删除高速缓存
| |
性能和内存消耗
| |
使用类共享的局限性和注意事项
| |
高速缓存大小限制
| |
运行时字节码修改
| |
操作系统局限性
| |
使用 SharedClassPermission
| |
修改定制类装入器来共享类
为独立软件供应商提供的服务和支持
辅助功能选项
iKeyman 辅助功能选项
Swing 中 JComboBox 组件的键盘遍历
Web Start 辅助功能选项
有关安全性的一般注释
已知局限性
对本《用户指南》的意见？
声明
商标

# 概述

IBM SDK 是一个开发环境，用于编写和运行与 IBM Java 5.0 核心应用程序接口（API）相符的 applet 和应用程序。

SDK 包含 Runtime Environment for Windows，专门让您能够运行 Java 应用程序。如果安装了 SDK，则表示已包括 Runtime Environment。

Runtime Environment 包含 Java 虚拟机以及包括类文件的支持文件。Runtime Environment 只包含 SDK 中的部分类，让您能够在运行时支持 Java 程序，但不支持编译 Java 程序。Runtime Environment for Windows 不包含任何开发工具，如 appletviewer.exe 或 Java 编译器（javac.exe）或仅用于开发系统的类。

另外，提供了 Java Communications 应用程序编程接口（API）程序包供 Runtime Environment for Windows 使用。可以在使用 Java Communications API（JavaComm）中找到它的相关信息。

## 版本兼容性

通常，任何使用先前版本的 SDK 运行的 applet 或应用程序都应可以使用 IBM 32-bit SDK for Windows, v5.0 正确运行。但不保证使用此发行版编译的类可以在先前的发行版上工作。

|IBM 32-bit SDK for Windows V5.0 是使用 Microsoft Visual Studio .NET 2003 构建的。

要阅读 Sun 有关兼容性的文档，请参阅 Sun Web 站点 http://java.sun.com。

## 升级 SDK

如果您正在从先前发行版升级 SDK，请在继续升级之前，备份所有的配置文件和安全策略文件。

升级后，可能需要恢复或重新配置这些文件，因为它们在升级过程中可能已经被覆盖。在恢复原始文件之前，请检查新文件的语法，因为原始文件的格式或选项可能已经更改。

## 从其他 IBM JVM 进行迁移

在 V5.0 上，IBM Runtime Environment for Windows 包含新版本的 IBM Java 虚拟机和 Just-In-Time（JIT）编译器。如果您正在从较早的 IBM Runtime Environment 进行迁移，请注意：

- JVM 动态链接库 jvm.dll 安装在目录 jre\bin\j9vm 中。这不同于其他版本，例如 Runtime Environment for Windows for Version 1.4.2（它安装在 jre\bin\classic 中）。使用 JNI 调用接口的本机应用程序可能需要将新的目录路径添加到它们的环境变量中以定位 JVM 动态链接库。
- |JVM 监视接口（JVMMI）不再可用。您必须重新编写使用该 API 的应用程序。建议您改为使用 JVM 工具接口（JVMTI）。JVMTI 在功能上不等同于 JVMMI。要获取有关 JVMTI 的信息，请参阅 http://java.sun.com/j2se/1.5.0/docs/guide/jvmti/ 和 Diagnostics Guide。
- |JNI 的新实现符合 JNI 规范，但与原先的实现不同。它返回对象副本，而不是固定对象。这种差异可以显露 JNI 应用程序代码中的错误。要获取有关调试 JNI 代码的信息，请参阅非标准选项中的 -Xcheck:jni。
- |使用 -verbose:gc 获得的垃圾收集器详细日志的格式和内容已经更改。数据现在使用 XML 格式。数据内容反映了 JVM 中对垃圾回收实施的更改；作为输出的统计信息中大部分已经更改。您必须更改所有处理详细 GC 输出的程序，以便它们使用新的格式和数据工作。请参阅 Diagnostics Guide 获取新的详细 GC 数据的示例。
- IBM JRE 的较早版本在 jre/lib 目录中附带提供一个名为 rt.jar 的文件。从 Java V1.4 起，此文件被替换为驻留在 jre/lib 目录中的多个 JAR 文件。
- |有关其他的行业兼容性和不提倡的 API 信息，请参阅 Sun's Java 5 Compatibility Documentation 和 Sun's Java 5 Depreciated API List

# SDK 和 Runtime Environment 的内容

SDK 包含几个开发工具和一个 Java Runtime Environment（JRE）。本节描述 SDK 工具和 Runtime Environment 的内容。

完全以 java 编写的应用程序应该不依赖于 IBM SDK 目录结构（或那些目录中的文件）。任何对 SDK 目录结构（或那些目录中的文件）的依赖性都可能导致应用程序可移植性问题。Java 本机接口（JNI）应用程序将有一些轻微的依赖性。

## Runtime Environment 工具

- 核心类 － 这些是适用于平台的已编译类文件，必须保持压缩形式供编译器和解释器访问。请勿修改这些类；而是创建子类，在需要的地方进行覆盖。
- JRE 工具 － 以下工具属于 Runtime Environment，并且位于 jre\bin 目录中（除非另外指定）。
  - java.exe（Java 解释器）
    - 运行 Java 类。Java 解释器运行以 Java 编程语言编写的程序。
  - javaw.exe（Java 解释器）
    - 以和 java 命令相同的方式运行 Java 类，但不使用控制台窗口。
  - keytool.exe（密钥和证书管理工具）
    - 管理专用密钥的密钥库（数据库）以及和这些密钥关联的、认证相应公用密钥的 X.509 证书链。
  - policytool.exe（策略文件创建和管理工具）
    - 创建和修改外部策略配置文件，这些文件定义安装的 Java 安全策略。
  - rmid.exe（RMI 激活系统守护程序）
    - 启动激活系统守护程序，以便可以在 Java 虚拟机（JVM）中注册并激活对象。
  - tnameserv.exe（公共对象请求代理体系结构（CORBA）命名服务）
    - 启动 CORBA 瞬态命名服务。
  - rmiregistry.exe（Java 远程对象注册表）
    - 在当前主机的指定端口上创建并启动远程对象注册表。
  - ikeyman.exe（iKeyman GUI 实用程序）
    - 使您能够管理密钥、证书和证书请求。有关更多信息，请参阅随附的《安全指南》以及 http://www.ibm.com/developerworks/java/jdk/security。SDK 还提供此实用程序的命令行版本。请参阅 iKeyman 辅助功能选项获取详细信息。
  - jextract.exe（转储抽取器）
    - 将系统产生的转储转换为可以被 jdmpview 使用的公共格式。请参阅 Diagnostics Guide 获取更多信息。
  - javaws.exe（Java Web Start）
    - 启用 Java 应用程序的部署和自动维护。

## SDK 工具

- 以下工具是 SDK 的一部分，位于 C:\Program Files\IBM\Java50\bin 目录中：
  - javac.exe（Java 编译器）
    - 将以 Java 编程语言编写的程序编译为字节代码（已编译的 Java 代码）。
  - appletviewer.exe（Java Applet 查看器）
    - 在 Web 浏览器外部测试并运行 applet。
  - jdb.exe（Java 调试器）
    - 帮助调试 Java 程序。
  - javap.exe（类文件反汇编程序）
    - 反汇编编译的文件，并可以打印字节代码的表示形式。
  - javadoc.exe（Java 文档生成器）
    - 从 Java 源文件生成 API 文档的 HTML 页面。
  - javah.exe（C 头文件和存根文件生成器）
    - 使您能够将本机方法与以 Java 编程语言编写的代码关联。
  - jar.exe（Java 归档工具）
    - 将多个文件组合到一个 Java 归档（JAR）文件中。
  - jarsigner.exe（JAR 签署和验证工具）
    - 生成 JAR 文件的签名，以及验证已签署的 JAR 文件的签名。
  - jconsole.exe（JConsole 监视和管理工具 － 试用）
    - 试用（不受支持）的 JMX 兼容图形工具，用于监视本地和远程 JVM。
  - native2ascii.exe（本机至 ASCII 的转换器）
    - 将本机编码文件转换为包含以 Latin-1 和／或 Unicode 编码的字符的 ASCII 文件。
  - rmic.exe（Java 远程方法调用（RMI）存根转换器）
    - 生成远程对象的存根、框架和联系。包含“因特网 ORB 间协议上的 RMI”（RMI-IIOP）支持。
  - idlj.exe（IDL 到 Java 的编译器）
    - 从给定的 IDL 文件生成 Java 绑定。
  - serialver.exe（串行化版本命令）
    - 以适合复制到进化的类中的格式返回一个或多个类的 serialVersionUID。
  - extcheck.exe（Extcheck 实用程序）
    - 检测目标 jar 文件和当前安装的扩展 jar 文件之间的版本冲突。
  - jdmpview.exe（跨平台转储格式化程序）
    - 使您能够分析转储的工具。请参阅 Diagnostics Guide 获取更多信息。
  - htmlconverter.exe（Java Plug-in HTML 转换器）
    - 将包含 applet 的 HTML 页面转换为可以使用 Java Plug-in 的格式。
- INCLUDE FILES
  - JNI 程序的 C 头部分。
- DEMOS
  - 演示目录包含许多子目录，这些子目录包含您可以使用的样本源代码、演示、应用程序和 applet。
- COPYRIGHT
  - SDK for Windows 软件的版权声明。
- LICENSE
  - LICENSE 文件（C:\Program Files\IBM\Java50\license）包含 SDK for Windows 软件的许可证协议。要查看或打印许可协议，请在 Web 浏览器中打开此文件。

注：《用户指南》、Javadoc 以及随附的许可证、版权文件和演示目录是包含在此 SDK for Windows 中的仅有的文档。您可以通过访问以下 Sun Web 站点查看 Sun 的软件文档，也可以从该站点下载 Sun 的软件文档包：http://java.sun.com。

# 安装和配置 SDK 与 Runtime Environment

## 安装前

要安装 SDK 或 Runtime Environment 程序包，请下载相关的安装程序包。确保将所有程序包下载到同一个目录。这些程序包和它们的文件名列出在照管（交互式）安装中；请勿更改程序包的文件名。

在开始安装之前，请确保在您的 C:\WINDOWS\TEMP 目录中有足够的空间供安装过程中使用。安装过程中，在 TEMP 目录中所需的临时空间量为：

- SDK 可安装程序包：130 MB
- Runtime Environment 可安装程序包：85 MB

如果没有足够的临时空间，安装程序将生成错误并终止安装。如果确实具有足够的临时空间，但仍然看到此消息，则请验证是否完全下载了正在尝试安装的程序包。可以通过将程序包的大小与下载程序包的来源 Web 页面上显示的文件大小比较来进行验证。

## 照管（交互式）安装

您可以安装的程序包有：

- SDK 可安装程序包：ibm-java2-sdk-50-win-i386.exe
- Runtime Environment 可安装程序包：ibm-java2-jre-50-win-i386.exe
- Runtime Environment 可安装程序包（仅限 IBM 硬件）：ibm-java2-jre-50-ibmpc-win-i386.exe

其他程序包作为 zip 文件提供：

- Runtime Environment 程序包：ibm-java2-jre-50-win-i386.zip
- SDK 程序包：ibm-java2-sdk-50-win-i386.zip
- 用于 Windows 的 Java Communications 应用程序编程接口（API）程序包：ibm-java2-javacomm-50-win-i386.zip。 请参阅安装 Java Communications API 一章来获取安装指示的信息。
- “文档”程序包：ibm-java2-docs-50-win-i386.zip
- “演示”程序包：ibm-java2-demos-50-win-i386.zip

### 安装程序包

1. 启动 ibm-java2-sdk-50-win-i386.exe（对于 SDK）或 ibm-java2-jre-50-win-i386.exe（仅限 Runtime Environment）。
2. 按照安装向导中的指示信息执行操作。

缺省情况下，Runtime Environment 安装在目录 C:\Program Files\IBM\Java50\jre 中。

如果下载了 SDK 可安装程序包，您可以选择是否安装：

- SDK 开发工具（例如 Java 编译器）
- Runtime Environment
- 某些工具用于调试应用程序的 Sun 类库的源代码。

可以单独或组合安装这些组件。

在安装向导中，将对您提供以下选项：

- 典型 － 此选项安装所有的三个组件。
- 精简 － 此选项只安装 Runtime Environment。
- 定制 － 此选项使您可以选择安装哪些组件。

### 安装 Runtime Environment 作为系统 Java 虚拟机

当安装 Runtime Environment（作为 SDK 可安装程序包的一部分或从 Runtime Environment 可安装程序包进行安装）时，会询问您是否要安装 Runtime Environment 作为系统 Java 虚拟机（JVM）。如果您确实要安装它作为系统 JVM，安装程序就会将 java.exe 和 javaw.exe 文件复制到 Windows 系统目录中。如果当前在 Windows 系统目录中存在某个版本的 java.exe 或 javaw.exe，就会提示您以当前版本覆盖现有版本。将这些文件安装到 Windows 系统目录中将使此 Runtime Environment 成为系统的缺省 JVM。另外，“Current Version”注册表键将设置为与此安装匹配。

注:
将 Runtime Environment 安装为系统 JVM，只会将 java.exe 和 javaw.exe 复制到 Windows 系统目录中。不会复制任何其他可执行文件（如 javac.exe 或 appletviewer.exe）。

## 无人照看的安装

要创建无人照看的安装，您必须首先完成照看安装，创建一个响应文件（setup.iss），该文件记录您在安装过程中所作的选择。创建的响应文件对于您计划使用该文件的计算机，必须是正确的。如果必要，可创建几个响应文件，来用于在多台有不同配置的计算机上安装程序包。

要在运行安装时创建响应文件，请在命令提示符下输入：

    ibm-java2-sdk-50-win-i386 /r

或

    ibm-java2-jre-50-win-i386 /r

根据您的 Windows 产品，响应文件（setup.iss）会创建在 C:\Windows 或 C:\Winnt 目录中，其中 C: 是引导驱动器。

在交互式安装的过程中可能产生以下消息：

    另一个 Java Runtime Environment 当前已安装为系统 JVM。选择“是”覆盖此版本，或选择“否”退出此安装。

如果显示此消息，请选择否，从安装退出。转至 Windows 系统目录并删除以下两个文件：

- java.exe
- javaw.exe

删除这些文件之后，请使用本节开始处显示的命令重新启动交互式安装。

在您将运行无人照看的安装的系统上，将 setup.iss 响应文件复制到 C:\Windows 目录中。复制该文件之后，在命令提示符下输入：

    ibm-java2-sdk-50-win-i386 /s /f1c:\Windows\setup.iss /f2c:\setup.log
    ibm-java2-jre-50-win-i386 /s /f1c:\Windows\setup.iss /f2c:\setup.log

注:

1. 在 `/f1` 或 `/f2` 之后没有空格。
2. `/f1` 标志指定响应文件的名称和位置。`/f2` 标志指定日志文件的名称和位置。

如果安装成功，日志文件将包含字符串 `ResultCode=0`。

## 启用 IBM Accessibility Bridge

IBM Accessibility Bridge 已安装，但在缺省情况下是禁用的。要启用 IBM Accessibility Bridge，请从 jre/lib 目录中 Accessibility.properties 文件的以下行的开始处删除数字符号。

    #assistive_technologies=JawBridge

以下 Web 站点可告诉您关于辅助功能选项实用程序的更多信息：

http://java.sun.com/products/jfc/accessibility.html

## 禁用 Java 辅助功能选项支持

您可以禁用 Java 辅助功能选项支持来提高不提供 Java 辅助技术支持的 Java 应用程序的 JVM 装入性能（尤其是通过网络链接装入时）。

要禁用 Java 辅助功能选项支持，请将 JAVA_ASSISTIVE 环境变量设置为 OFF。对于某项辅助技术（如 JawBridge），如果此环境变量设置为 OFF，则即使在 Accessibility.properties 文件中启用了该技术，它也是不可用的。

## 适用于欧洲语言用户的信息

在 Windows 中，进程有两个代码页：ANSI（或 Windows）代码页和 OEM（或 DOS）代码页。

命令窗口通常使用 OEM 代码页。Java 控制台输出使用从中启动 Java 的命令窗口的代码页。但是，javaw 命令始终使用 ANSI 代码页。通过在 java 命令上使用 -Dconsole.encoding 选项来指定用于控制台输出的代码页。例如，-Dconsole.encoding=Cp1252 使所有的控制台输出都采用 Windows ANSI Latin1 代码页（1252）。

## 设置 PATH

请注意，如果如下所述，改变 PATH 环境变量，那么您将覆盖路径中的所有现有的 Java 可执行程序。

安装 SDK 之后，您可以通过在 shell 提示符下以文件名作为参数输入工具名称，来运行工具。

可以通过每次在工具名称前输入路径，来指定工具的路径。例如，如果 SDK for Windows 安装在 C:\Program Files\IBM\Java50\bin 中，您可以通过在命令提示符下输入以下命令，编译名为 myfile.java 的文件：

      "C:\Program Files\IBM\Java50\bin\javac" myfile.java

为避免每次都要输入完整路径：

1. 将以下目录添加到 PATH 环境变量中：
   - C:\Program Files\IBM\Java50\bin（仅 SDK）
   - C:\Program Files\IBM\Java50\jre\bin（SDK 和 Runtime Environment）

   如果 SDK 或 Runtime Environment 安装在不同的目录中，请将 C:\Program Files\IBM\Java50\ 替换为安装 SDK 或 Runtime Environment 的目录。

2. 使用 javac 工具编译该文件。例如，要编译文件 myfile.java，请在命令提示符下，输入：

         javac myfile.java

   PATH 环境变量让 Windows 可以从任何当前目录中找到可执行文件，如 javac、java 和 javadoc。要显示 PATH 的当前值，请在命令提示符下，输入以下命令：

         echo %PATH%

## 设置 CLASSPATH

CLASSPATH 告知 SDK 工具（如 java、javac 和 javadoc）何处可以找到 Java 类库。

仅在以下情况之一中，您才需要显式地设置 CLASSPATH：

- 您需要使用一个不同的库或类文件（例如您自行开发的），而它又不在当前目录中。
- 您更改 bin 和 lib 目录的位置，使它们不再有同一个公共父目录。
- 您计划开发或运行在同一系统上使用不同运行时环境的应用程序。

要显示 CLASSPATH 的当前值，请在命令提示符下，输入以下命令：

      echo %CLASSPATH%

如果您计划开发或运行使用不同运行时环境的应用程序，包括已经单独安装的其他版本，则必须为每个应用程序显式地设置 CLASSPATH（和 PATH）。如果您计划同时运行多个应用程序并使用不同运行时环境，则每个应用程序都必须在它自己的命令窗口中运行。

如果您想一次只运行一个版本的 Java，则可以使用 batch 脚本，来在不同的运行时环境之间进行切换。

## 卸载

要卸载 SDK（无论原先是使用照看安装还是使用无人照看安装进行安装的）：

1. 在 Windows 桌面上双击我的电脑。
2. 双击控制面板。
3. 双击添加/删除程序。
4. 在列表中单击 IBM 32-bit SDK for Java 2 V5.0，然后单击更改/删除。
5. 单击确定。

此过程将除去使用安装程序安装的所有程序包。它不除去 Java Communications API 程序包（请参阅 Java Communications API）以及任何已经从 zip 包中解压缩出的其他文件。

注:
可能会显示警告消息，通知您不是所有文件和／或注册表条目都已除去。因为 Windows 认为某些文件仍在使用，所以发出这些警告；这些文件和／或注册表条目将在下次重新引导的过程中除去。

当在 IBM 32-bit SDK for Windows, v5.0 和 V1.3.1 或更早版本之间维护多个安装时，如果您卸载较早的版本，而保留版本 V5.0 安装在系统上，那么 V1.3.1 卸载程序将除去以下注册表键和所有子键，而这些注册表键和子键又是 V5.0 版本所必需的，因此就会破坏 V5.0 的安装：

- HKEY_LOCAL_MACHINE/Software/IBM/Java2 Runtime Environment
- HKEY_LOCAL_MACHINE/Software/IBM/Java Development Kit

因而，请在卸载 V1.3.1 版本之后，重新安装 V5.0。在 V1.4.0 和所有后续发行版中已经修正了这个卸载程序限制。

# 使用 Runtime Environment

java 工具通过启动 Java Runtime Environment 并装入指定的类，来启动 Java 应用程序。

JVM 在以下三组位置中搜索初始类（和使用的其他类）：引导类路径、安装的扩展和用户类路径。在类名或 JAR 文件名之后指定的参数被传递给主函数。

javaw 命令与 java 相似，除了 javaw 没有关联的控制台窗口。请在不需要出现命令提示窗口时使用 javaw。如果启动失败，javaw 启动程序将显示一个带有错误信息的对话框。

java 和 javaw 命令具有以下语法：

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

在方括号内出现的项是可选的。

options
  命令行选项。
class
  要调用的类名。
file.jar
  要调用的 jar 文件的名称。只能与 -jar 一起使用。
arguments
  传递给主函数的参数。

如果指定 -jar 选项，则命名的 JAR 文件包含应用程序的类和资源文件，启动类由主类清单头指示。

## 选项

启动程序具有一系列标准选项，这些选项在当前的 Runtime Environment 中受支持，在今后的发行版也将受到支持。此外，还有一系列非标准选项。为了更好地通用，已经选择了缺省选项。决定更改时，应当保持谨慎。

### 指定 Java 选项和系统属性

可以使用三种不同的方法指定 Java 选项和系统属性。根据优先顺序，它们依次是：

1. 在命令行上指定选项或属性，例如 `java -Dmysysprop1=tcpip -Dmysysprop2=wait -Xdisablejavadump MyJavaClass`。
2. 创建包含这些选项的文件，并使用 -Xoptionsfile=<filename> 在命令行上指定它。
3. 创建包含这些选项的名为 IBM_JAVA_OPTIONS 的环境变量，例如 `set IBM_JAVA_OPTIONS="-Dmysysprop1=tcpip -Dmysysprop2=wait -Xdisablejavadump"`。

命令行上最右的选项优先于最左的选项；例如，如果指定选项 `-Xint -Xjit myClass`，则 -Xjit 优先。

### 标准选项

- -D<property_name>=<value>
  - 设置系统属性。
- -assert
  - 打印有关与断言相关的选项的帮助。
- -cp 或 -classpath <用 ; 分隔的目录和 zip 或 jar 文件>
  - 设置应用程序类和资源的搜索路径。如果不使用 -classpath 和 -cp ，也不设置 CLASSPATH，则缺省情况下，用户的类路径是当前目录（.）。
- -help 或 -?
  - 打印使用消息。
- -showversion
  - 打印产品版本并继续。
- -verbose:[class,gcterse,gc,dynload,stackwalk,sizes,stack,debug,jni]
  - 启用详细输出。
- -version
  - 打印产品版本。
- -version:<value>
  - 需要运行指定的版本。
- -jre-restrict-search
  - 在版本搜索中包含用户专用的 JRE
- -no-jre-restrict-search
  - 在版本搜索中排除用户专用的 JRE
- -agentlib:<libname>[=<options>]
  - 装入本机代理程序库 <libname>，例如 -agentlib:hprof。要获取更多信息，请在命令行上指定 -agentlib:jdwp=help 和 -agentlib:hprof=help。
- -agentpath:libname[=<options>]
  - 以完整路径名装入本机代理程序库
- -javaagent:<jarpath>[=<options>]
  - 装入 Java 编程语言代理程序；有关更多信息，请参阅 java.lang.instrument API 文档。
- -X
  - 打印关于非标准选项的帮助。

### 非标准选项

下面列出的 -X 选项是非标准的；它们可能发生更改，而不另行通知。

对于采用 <size> 参数的选项，您应该在数字后加上“k”或“K”后缀来指示千字节，加上“m”或“M”后缀来指示兆字节，或者加上“g”或“G”来指示吉字节。

- -Xargencoding
  - 使您能够在参数列表中放置 Unicode 换码序列。缺省情况下，此选项设置为关闭。
- -Xbootclasspath：<用 ; 分隔的目录和 zip 或 jar 文件>
  - 设置引导程序类和资源的搜索路径。缺省情况下，会在内部 VM 目录和 .jar 文件中搜索引导程序类和资源。
- -Xbootclasspath/a：<用 ; 分隔的目录和 zip 或 jar 文件>
  - 将指定的目录、zip 或 jar 文件附加到引导程序类路径的结尾。缺省情况下，会在内部 VM 目录和 .jar 文件中搜索引导程序类和资源。
- -Xbootclasspath/p：<用 ; 分隔的目录和 zip 或 jar 文件>
  - 将指定的目录、zip 或 jar 文件附加到引导程序类路径的开头。请勿部署使用 -Xbootclasspath: 或 -Xbootclasspath/p: 选项在标准 API 中覆盖某个类的应用程序，因为这种部署会与 Java 2 Runtime Environment 二进制代码许可证相抵触。缺省情况下，会在内部 VM 目录和 .jar 文件中搜索引导程序类和资源。
- -Xcheck:jni
  - 对 JNL 函数执行附加检查。您也可以使用 -Xrunjnichk。缺省情况下，不执行任何检查。
- -Xcheck:nabounds
  - 对 JNI 数组运算执行附加检查。您也可以使用 -Xrunjnichk。缺省情况下，不执行任何检查。
- |-Xclassgc |
  |
  - 此选项在每次执行垃圾回收时启用类对象回收。缺省情况下，启用此选项。
- -Xcompactexplicitgc
  - 在每个对 `System.gc()` 的调用上进行压缩。另见 -Xnocompactexplicitgc。缺省情况下，压缩只在内部触发时，才会发生。
- -Xcompactgc
  - 压缩每个“垃圾收集器”周期。另见 -Xnocompactgc。缺省情况下，压缩只在内部触发时，才会发生。
- |-Xconcurrentbackground <number> |
  |
  - 此选项指定连接的、用来在并发标记中辅助增变线程的低优先级后台线程的数量。缺省值为 1。
- |-Xconcurrentlevel <number> |
  |
  - 此选项指定分配“税”率。它指示分配的堆总量与标记的堆总量之间的比率。缺省值为 8。
- |-Xconmeter:<soa | loa | dynamic> |
  |
  - 此选项确定测量哪一个区域的使用情况（LOA 或 SOA）并因此在并发标记的过程中对哪些分配进行“征税”。使用 -Xconmeter:soa 将分配“税”应用于从小对象区域（SOA）所作的分配；使用 -Xconmeter:loa 将分配“税”应用于从大对象区域（LOA）所作的分配。如果指定了 -Xconmeter:dynamic，则收集器将根据哪个区域首先耗尽（无论它是 SOA 还是 LOA），来动态地确定要测量的区域。缺省情况下，此选项设置为 -Xconmeter:soa。
- -Xdbg:<options>
  - 装入调试库以支持远程调试应用程序。这与 -Xrunjdwp 相同。缺省情况下，不装入调试库，也不启用 VM 实例执行调试。
- -Xdbginfo:<path to symbol file>
  - 装入选项并将它们传送给调试信息服务器。缺省情况下，禁用调试信息服务器。
- -Xdebug
  - 启动已启用调试器的 JVM。缺省情况下，禁用调试器。
- |-Xdisableexcessivegc |
  |
  - 此选项禁止当在 GC 中花费过多的时间时抛出 OutOfMemory 异常。缺省情况下，此选项为关闭。
- -Xdisableexplicitgc
  - 通知 VM 调用 `System.gc()` 的信号可能无效。缺省情况下，对 `System.gc()` 的调用会触发垃圾回收。
- |-Xdisablestringconstantgc |
  |
  - 此选项防止收集字符串保留区表中的字符串。缺省情况下，禁用此选项。
- -Xdisablejavadump
  - 关闭在出现错误和信号时的 javadump 生成。缺省情况下，启用 javadump 生成。
- |-Xenableexcessivegc |
  |
  - 如果在 GC 中花费过多的时间，此选项就会对分配请求返回 NULL，并因此导致抛出 OutOfMemory 异常。只有在堆已完全扩展并且所用时间至少占 95% 时，才会发生此操作。此行为是缺省行为。
- |-Xenablestringconstantgc |
  |
  - 此选项启用收集来自字符串保留区表的字符串。缺省情况下，启用此选项。
- -Xfuture
  - 打开严格的类文件格式检查。当开发新代码时，请使用此标志，因为在将来的发行版中，缺省情况下会执行较严格的检查。缺省情况下，禁用严格的格式检查。
- -Xgcpolicy:[optthruput]|[optavgpause]|[gencon]
  - 控制垃圾收集器的行为。optthruput 选项是缺省选项；它向应用程序传递非常高的吞吐量，但以偶尔的暂停为代价。optavgpause 选项缩减在这些垃圾回收暂停中耗费的时间，并限制增长的堆大小对垃圾回收暂停时间长度的影响。如果您的配置有非常大的堆，请使用 optavgpause。gencon 选项请求组合使用并发和分代 GC 来帮助使在任何垃圾回收暂停中耗费的时间最小化。有关更多信息，请参阅指定垃圾收集策略。
- -Xgcthreads<number of threads>
  - 设置在垃圾回收过程中用于并行操作的助手线程的数量。缺省情况下，线程的数量设置为存在的物理 CPU 数 -1，最小值为 1。
- |-Xgcworkpackets <number> |
  |
  - 此选项指定在全局收集器中可用的工作包的总数。如果未指定，收集器将根据最大堆大小来分配包的数量。
- -Xint
  - 使 JVM 只使用解释器，同时禁用 Just-In-Time（JIT）编译器。缺省情况下，启用 JIT 编译器。
- -Xiss<size>
  - 设置初始 Java 线程堆栈大小。缺省情况下为 2 千字节。
- -Xjit[:<suboption>,<suboption>,...]
  - 启用 JIT。有关子选项的详细信息，请参阅 Diagnostics Guide。另见 -Xnojit。缺省情况下，启用 JIT。
- -Xlinenumbers
  - 显示堆栈跟踪中的行数，用于调试。另见 -Xnolinenumbers。缺省情况下，行数为打开。
- |-Xloa |
  |
  - 此选项将分配大对象区域（LOA）。对象将被分配到此 LOA 中而不是 SOA 中。缺省情况下，除了 subpool（LOA 在该处不可用），对所有的 GC 策略都启用 LOA。另见 -Xnoloa。
- |-Xloainitial <number> |
  |
  - <number> 介于 0 和 0.95 之间，该数指定当前分配给大对象区域（LOA）的永久占有空间的初始百分比。缺省值为 0.05 或 5%。
- |-Xloamaximum <number> |
  |
  - <number> 介于 0 和 0.95 之间，该数指定当前分配给大对象区域（LOA）的永久占有空间的最大百分比。缺省值为 0.5 或 50%。
- |-Xlp（Windows 2003） |
  |
  - 请求 JVM 以大页面分配 Java 堆。如果大页面不可用，JVM 将不会启动，并显示错误消息 `GC：系统配置不支持选项 -->“-Xlp”`。运行 Windows 2003 的系统（它们的操作系统被设置为使用大页面）都支持大页面。缺少情况下，不使用大页面。请参阅配置大页面内存分配。
- -Xmaxe<size>
  - 设置垃圾收集器扩展堆所依照的最大数量。通常，当可用空间量降到低于 30%（或降到使用 -Xminf 指定的数量）时，垃圾收集器按照将可用空间恢复到 30% 所需的数量扩展堆。-Xmaxe 选项将扩展限制为指定的值；例如 `-Xmaxe10M` 将扩展限制为 10MB。缺省情况下，没有最大扩展大小。
- -Xmaxf<size>
  - 指定在垃圾回收之后必须可用的堆最大百分比。如果可用空间超出此数量，JVM 将尝试缩小堆。将大小指定为一个范围在 0-1 之间的十进制值，例如 `-Xmaxf0.5` 将最大可用空间设置为 50%。缺省值为 0.6（60%）。
- -Xmca<size>
  - 为分配用来存储所装入类的 RAM 部分的内存设置扩展步幅。每次需要更多内存来在 RAM 中存储类时，分配的内存就按照此数量增长。缺省情况下，扩展步幅为 32K。
- -Xmco<size>
  - 为分配用来存储所装入类的 ROM 部分的内存设置扩展步幅。每次需要更多内存来在 ROM 中存储类时，分配的内存就按照此数量增长。缺省情况下，扩展步幅为 128K。
- -Xmine<size>
  - 设置垃圾收集器扩展堆所依照的最小数量。通常，垃圾收集器按照将可用空间恢复到 30% 所需的内存量（或按照 -Xminf 指定的数量）扩展堆。-Xmine 选项将扩展设置为至少是指定的值；例如 `-Xmine50M` 将扩展大小设置为最小 50 MB。缺省情况下，最小扩展大小为 1MB。
- -Xminf<size>
  - 指定在垃圾回收之后应该可用的堆最小百分比。如果可用空间降到低于此数量，JVM 将尝试扩展堆。将大小指定为一个范围在 0-1 之间的十进制值；例如，值 `-Xminf0.3` 请求最小可用空间为堆的 30%。缺省情况下，最小值为 0.3。
- -Xmn<size>
  - 使用 -Xgcpolicy:gencon 时，将新的（短期存在）堆的初始和最大大小设置为指定的值。相当于同时设置 -Xmns 和 -Xmnx。|如果设置了 -Xmns 或 -Xmnx，就不能设置 -Xmn。如果尝试连同 -Xmns 或 -Xmnx 设置 -Xmn，VM 将不启动，并返回错误。缺省情况下，-Xmn 是根据您的系统的能力在内部选择的。您可以使用 -verbose:sizes 选项找出 VM 当前正在使用的值。
- -Xmns<size>
  - 使用 -Xgcpolicy:gencon 时，将新的（短期存在）堆的初始大小设置为指定的值。缺省情况下，此选项是根据您的系统的能力在内部选择的。|如果您尝试将此选项与 -Xmn 一起使用，它将返回错误。
- -Xmnx<size>
  - 使用 -Xgcpolicy:gencon 时，将新的（短期存在）堆的最大大小设置为指定的值。缺省情况下，此选项是根据您的系统的能力在内部选择的。|如果您尝试将此选项与 -Xmn 一起使用，它将返回错误。
- -Xmo<size>
  - 使用 -Xgcpolicy:gencon 时，将旧的（永久占有）堆的初始和最大大小设置为指定的值。相当于同时设置 -Xmos 和 -Xmox。|如果设置了 -Xmos 或 -Xmox，就不能设置 -Xmo。如果尝试连同 -Xmos 或 -Xmox 设置 -Xmo，VM 将不启动，并返回错误。缺省情况下，-Xmo 是根据您的系统的能力在内部选择的。您可以使用 -verbose:sizes 选项找出 VM 当前正在使用的值。
- -Xmos<size>
  - 使用 -Xgcpolicy:gencon 时，将旧的（永久占用）堆的初始大小设置为指定的值。缺省情况下，此选项是根据您的系统的能力在内部选择的。|如果您尝试将此选项与 -Xmo 一起使用，它将返回错误。
- -Xmox<size>
  - 使用 -Xgcpolicy:gencon 时，将旧的（永久占用）堆的最大大小设置为指定的值。缺省情况下，此选项是根据您的系统的能力在内部选择的。|如果您尝试将此选项与 -Xmo 一起使用，它将返回错误。
- -Xmoi<size>
  - 使用 -Xgcpolicy:gencon 时，设置 Java 堆递增的数量。如果设置为零，将不允许扩展。缺省情况下，增量大小是根据扩展大小 -Xmine 和 -Xminf 计算的。
- -Xmr<size>
  - 使用 -Xgcpolicy:gencon 时，设置垃圾回收“记忆设置”的大小。这是老的（永久占有）堆中的对象列表，该堆引用了新的（短期存在）堆中的对象。缺省情况下，此选项设置为 16 千字节。
- -Xms<大小>
  - 设置初始 Java 堆大小。还可以使用 -Xmo。缺省值是根据您的系统的能力在内部设置的。
- -Xmso<size>
  - 设置派生的 Java 线程的 C 堆栈大小。缺省情况下，此选项在 32 位平台上设置为 32 千字节，在 64 位平台上设置为 256 千字节。
- -Xmx<size>
  - 设置最大 Java 堆大小。缺省情况下，此选项是根据您的系统的能力在内部设置的。
- -Xnoclassgc
  - 禁用类垃圾收集。此选项关闭与 JVM 不再使用的 Java 类关联的存储的垃圾回收。缺省行为是 -Xclassgc。
- -Xnocompactgc
  - 禁用垃圾收集器压缩。另见 -Xcompactgc。缺省情况下，启用压缩。
- -Xnocompactexplicitgc
  - 禁用在对 `System.gc()` 的调用上的压缩。另见 -Xcompactexplicitgc。缺省情况下，在对 `System.gc()` 的调用上启用压缩。
- -Xnojit
  - 禁用 JIT 编译器。另见 -Xjit。缺省情况下，启用 JIT 编译器。
- -Xnolinenumbers
  - 禁用行数的调试。另见 -Xlinenumbers。缺省情况下，行数是打开的。
- |-Xnoloa |
  |
  - 此选项防止分配大对象区域（LOA）。所有的对象将在 SOA 中进行分配。缺省情况下，除了 subpool（LOA 在该处不可用），对所有的 GC 策略都启用 LOA。另见 -Xloa。
- -Xnopartialcompactgc
  - 禁用增量压缩。另见 -Xpartialcompactgc。缺省情况下，此选项未设置，因此所有压缩都是满的。
- -Xnosigcatch
  - 禁用 JVM 信号处理代码。另见 -Xsigcatch。缺省情况下，启用信号处理。
- -Xnosigchain
  - 禁用信号处理程序链接。另见 -Xsigchain。缺省情况下，启用信号处理程序链接。
- -Xoptionsfile=<file>
  - 指定包含 JVM 选项和定义的文件。缺省情况下，不使用选项文件。
- -Xoss<大小>
  - 设置任意线程的 Java 堆栈大小和 C 堆栈大小。此选项是出于兼容性而提供的，相当于同时将 -Xss 和 -Xmso 设置为指定的值。
- -Xpartialcompactgc
  - 启用部分压缩。另见 -Xnopartialcompactgc。
- -Xquickstart
  - 通过延迟 JIT 编译和优化，改进启动时间。缺省情况下，禁用快速启动，并且不会延迟 JIT 编译。
- -Xrdbginfo:<host>:<port>
  - 装入选项并将它们传递给远程调试信息服务器。缺省情况下，禁用远程调试信息服务器。
- -Xrs
  - 减少使用操作系统信号。缺省情况下，VM 充分使用操作系统信号，请参阅 JVM 所使用的信号。
- -Xrun<library name>[:options]
  - 装入帮助函数库。要装入多个库，请在命令行上一次指定多个库。例如，这些库可以是：
    - -Xrunhprof[:help] | [:<option>=<value>, ...]
      - 执行堆、CPU 或监视器简述。请参阅 Diagnostics Guide 获取更多信息。
    - -Xrunjdwp[:help] | [:<option>=<value>, ...]
      - 装入调试库以支持远程调试应用程序。这与 -Xdbg 相同。有关更多信息，请参阅调试 Java 应用程序。
    - -Xrunjnichk[:help] | [:<option>=<value>, ...]
      - 执行 JNI 函数的附加检查，以跟踪使用 JNI 访问 JVM 的本机程序中发生的错误。请参阅 Diagnostics Guide 获取更多信息。
- |-Xscmx<size>[k|m|g] |
  |
  - 要获取 -Xscmx 的详细信息，请参阅使用命令行选项控制类共享。
- |-Xshareclasses:<suboptions> |
  |
  - 要获取 -Xshareclasses 子选项的详细信息，请参阅使用命令行选项控制类共享。
- -Xsigcatch
  - 启用 VM 信号处理代码。另见 -Xnosigcatch。缺省情况下，启用信号处理。
- -Xsigchain
  - 启用信号处理程序链接。另见 -Xnosigchain。缺省情况下，启用信号处理程序链接。
- |-Xsoftrefthreshold<number> |
  |
  - 此选项设置当没有标记软引用的引用目标时将在经过多少次 GC 后清除软引用。缺省值为 3，意味着如果没有标记引用目标，就在第三次 GC 时清除软引用。
- -Xss<大小>
  - 设置任意线程的最大 Java 堆栈大小。缺省情况下，此选项设置为 256 KB。
- -Xthr:<options>
  - 设置线程选项。
- -Xverbosegclog:<文件路径><文件名>[X, Y]
  - 使得 verboseGC 输出被写入指定文件。如果文件已经存在会被覆盖掉。否则，如果一个已存在文件不能被打开或者新文件不能被创建，输出会被重定向到 stderr。如果您指定参数 X 和 Y（两个参数都是整数），则 verboseGC 输出将被重定向到 X 个文件，每个文件都包含 Y 个值得 verboseGC 输出的 gc 循环。这些文件的格式有：filename1、filename2 等等。缺省情况下，不记录详细垃圾回收。
- -Xverify
  - 启用对装入的每个类的严格类检查。缺省情况下，禁用严格类检查。
- -Xverify:none
  - 禁用严格类检查。缺省情况下，禁用严格类检查。

## 获取 IBM build 和版本号

要获取 IBM 工作版本和版本号，请在命令提示符下输入：

    java -version

## Java 命令全局化

java 命令和其他 Java 启动程序命令（例如，javaw）允许类名被指定为在当前语言环境字符集中的任何字符。

您还可以通过使用 Java 换码序列来在类名和参数中指定任何 Unicode 字符。要执行此操作，必须指定 -Xargencoding。要指定 Unicode 字符，请以 `\u####` 格式使用转义序列，其中 # 是十六进制数字（0-9，A-F）。

或者，要指定类名和命令参数采用 UTF8 编码，可以使用 -Xargencoding:utf8；或要指定采用 ISO8859_1 编码，可以使用 -Xargencoding:latin。

例如，要指定名为“HelloWorld”的、对两个大写字母使用 Unicode 编码的类，您将使用以下命令：

    java -Xargencoding '\u0048ello\u0057orld'

java 和 javaw 命令给出翻译后的输出消息。这些消息根据运行 Java 的语言环境不同而有所不同。详细的错误描述和 java 返回的其他调试信息是英语的。

## 自动执行 Java 文件

要设置 java 类或 jar 文件以从文件自动执行，请使用 Windows 资源管理器的工具->文件夹选项->文件类型选项。或者，可以在命令提示符下输入：

    assoc .class=javaclass
    ftype javaclass=C:\Program Files\IBM\Java50\jre\bin\java.exe %l %*

注:

1. `%l` 是字母 l，而不是数字 1。
2. 如果 Java 的安装目录不是 C:\Program Files\IBM\Java50\，请替换您的目录。

## 用本机辅助技术运行 Java 应用程序

Sun 提供了 Java Access Bridge，这样本机 Windows 辅助技术（诸如屏幕阅读器）就能访问 Java 应用程序中的 Java 辅助功能支持。这些本机 Windows 辅助技术必须支持对 Java Access Bridge 的调用。

Sun 提供的 Java Access Bridge 包含一个安装程序，它将下列五个文件放到正确的目录中：access-bridge.jar、jaccess.jar、accessibility.properties、JavaAccessBridge.dll 和 WindowsAccessBridge.dll。IBM 在适当的目录中提供了 jaccess.jar 的副本，以便与 JawBridge 结合使用。

如果已经启用了 IBM Accessibility Bridge（JawBridge）（它允许 Windows 2000 Magnifier 与 Swing 应用程序一起运行），并同时启用 JawBridge 与 Java Access Bridge，请按以下信息编辑 accessibility.properties 文件中的行：

    assistive_technologies=com.sun.java.accessibility.AccessBridge,
    JawBridge

通过在开头插入 `#` 停用这两个桥，来注释掉该行。此 Web 站点告诉您如何下载 Java Access Bridge：

http://java.sun.com/products/jfc/accessibility.html

## Just-In-Time（JIT）编译器

在 Java 应用程序和 applet 运行期间，IBM Just-In-Time（JIT）编译器为它们中频繁使用的字节码序列动态生成机器代码。|JIT V5.0 编译器经过编译器研究，提供新的优化，改进了先前版本的 JIT 中实施的优化，同时提供更好的硬件运用。

IBM SDK 和 Runtime Environment 包含 JIT；缺省情况下，它在用户应用程序和 SDK 工具中是启用的。通常无需显式地调用 JIT；Java 字节码到机器代码的编译是透明进行的。但是，如果您在执行 Java 应用程序或 applet 时遇到 Runtime Environment 产生的问题，可以禁用 JIT 以帮助隔离问题。禁用 JIT 只能是一个临时办法；为了实现良好的性能，JIT 是必需的。

### 禁用 JIT

有三种方法可以禁用 JIT：

- 在运行 Java 应用程序之前，将 JAVA_COMPILER 环境变量设置为“NONE”或空字符串。

  在运行应用程序的命令提示符下，输入：

      set JAVA_COMPILER=NONE

  还可使用图形用户界面永久设置 JAVA_COMPILER。打开控制面板，选择系统，然后在高级选项卡上，选择环境变量。

- 在 JVM 命令行上使用 -D 选项将 java.compiler 属性设置为“NONE”或空字符串：

      java -Djava.compiler=NONE MyApp

- 在 JVM 命令行上使用 -Xint 选项。例如：

      java -Xint MyApp

这两个命令行选项都将覆盖 JAVA_COMPILER 环境变量。

### 启用 JIT

要显式地启用 JIT，请将 JAVA_COMPILER 环境变量设置为“jitc”，或使用 -D 选项将 java.compiler 属性设置为“jitc”。或者，在 JVM 命令行上使用 -Xjit 选项（并省略 -Xint 选项）打开 JIT。

如果将 JAVA_COMPILER 环境变量或 java.compiler 属性设置为“”（空字符串），则仍禁用 JIT。要正确复位环境变量，请在命令提示符下输入 `set JAVA_COMPILER=`。

### 确定是否已启用 JIT

要确定 JIT 是否已启用，请在命令提示符下输入以下命令：

    java -version

如果 JIT 没在使用，将显示一条包含以下内容的消息：

    （JIT 已禁用）

如果 JIT 正在使用，将显示一条包含以下内容的消息：

    （JIT 已启用）

有关 JIT 的更多信息，请参阅 Diagnostics Guide。

## 指定垃圾收集策略

垃圾收集器管理 Java 和在 VM 中运行的应用程序使用的内存。

当垃圾收集器收到存储请求时，堆中未使用的内存将被留出 －“分配”。垃圾收集器还检查不再引用的内存区域，并释放它们以进行复用 －“回收”。

收集阶段可以由内存分配故障（当没有剩余空间可用于存储请求时发生此故障）或显式 System.gc() 调用触发。

垃圾回收可能显著影响应用程序性能，所以 IBM 虚拟机提供各种优化垃圾回收实现途径的方法，从而降低对应用程序的影响。

有关垃圾回收更详细的信息，请参阅 Diagnostics Guide。

### 垃圾回收选项

-Xgcpolicy 选项指定垃圾收集策略。

-Xgcpolicy 使用值 optthruput（缺省值和推荐值）、optavgpause，或使用值 gencon。该选项控制垃圾收集器的行为，在应用程序和整个系统的吞吐量与由于垃圾收集引起的暂停时间之间进行权衡。

选项的格式及其值是：

> -Xgcpolicy:optthruput

> -Xgcpolicy:optavgpause

> -Xgcpolicy:gencon

### 暂停时间

当堆中的可用空间无法立即满足应用程序创建对象的尝试时，垃圾收集器就负责标识未引用的对象（垃圾）、删除它们并使堆返回到可以快速满足立即和后继分配请求的状态。这样的垃圾收集循环在应用程序代码执行中引起了偶发的意外暂停。因为应用程序的大小和复杂程度不断增长，堆也相应不断扩大，此垃圾收集暂停时间长度和影响方面一般也会有所增加。缺省的垃圾回收值 -Xgcpolicy:optthruput 向应用程序传递非常高的吞吐量，但要以这些偶发的暂停为代价，这些暂停可能从几毫秒到许多秒不等，取决于堆的大小和无用数据的数量。

### 减少暂停时间

JVM 使用两种技术来缩减暂停时间：

- 并发垃圾回收
- 分代垃圾回收

-Xgcpolicy:optavgpause 命令行选项请求使用并发垃圾回收来显著缩减在垃圾回收暂停上所耗费的时间。并发 GC 通过随正常的程序执行并行地执行一些垃圾回收活动，来最大程度地减少由堆收集导致的中断，从而缩减暂停时间。-Xgcpolicy:optavgpause 选项还限制增长堆大小对垃圾回收暂停长度的影响。-Xgcpolicy:optavgpause 选项对于有大堆的配置最有用。随着暂停时间的缩减，应用程序的吞吐量可能会有一定程度的减少。

在并发垃圾回收的过程中，大量时间被浪费在识别持续时间相对长而又最终无法回收的对象上。如果 GC 只是集中于那些最可能回收的对象，则可以进一步缩减某些应用程序的暂停时间。分代 GC 通过将堆分为两“代”（“短期存在”区域和“永久占有”区域）来实现此目标。对象根据它们的年龄，被放在其中一个区域中。“短期存在”是二者中较小的一个，包含较年轻的对象；“永久占有”较大，包含较老的对象。对象首先被分配给“短期存在”区域；如果它们生存足够长的时间，则最终被提交到“永久占有”区域。

大多数对象的分代 GC 不会持续很久。分代 GC 通过将精力集中在回收“短期存在”区域的存储上（因为它有可回收性最高的空间），而缩减暂停时间。与回收整个堆所产生的偶尔但冗长的暂停时间不同，回收“短期存在”区域更加频繁，而如果“短期存在”区域足够小，暂停时间就相对较短。但是，分代 GC 有缺点：随着时间的过去，如果有太多对象持续太长时间，永久占有区域就可能会变满。要在这种情况发生时使暂停时间最小化，请组合使用并发 GC 和分代 GC。-Xgcpolicy:gencon 选项请求组合使用并发 GC 和分代 GC，来帮助使在任何垃圾回收暂停中耗费的时间最小化。

### 具有很满的堆的环境

如果 Java 堆快满了，并且几乎没有要回收的垃圾，请求新对象可能不会被很快地满足，因为没有立即可用的空间了。如果在容量接近于满时操作堆，无论使用上述的哪个选项，应用程序性能都可能会受损；另外，如果继续请求更多的堆空间，则应用程序会接收到 OutofMemory 异常，如果未捕获和处理异常的话，这将导致 JVM 终止。此时 JVM 产生一个“javadump”诊断文件。在这些情况下，建议您使用 -Xmx 选项增加堆大小或减少使用中的应用程序对象的数目。请参阅 Diagnostics Guide 获取更多信息。

## JVM 如何处理信号

当出现一个 JVM 所关注的信号时，将调用一个信号处理程序。该信号处理程序判断它是被 Java 还是非 Java 线程调用。

如果信号是用于 Java 线程的，则 JVM 将接管对信号处理的控制。如果安装了此信号的应用程序处理程序，但没有指定 -Xnosigchain 命令行选项，则在 JVM 完成处理之后将调用此信号的应用程序处理程序。

如果信号是非 Java 线程的，并且安装 JVM 的应用程序以前安装过自己的信号处理程序，则控制权将交给该处理程序。否则，如果 JVM 或 Java 应用程序请求信号，就会忽略该信号或执行缺省操作。

这个规则的例外情况是在 Windows 上：在 Windows 上，对于外部（例如当输入 CTRL-BREAK 时）生成的信号，将创建一个新线程来执行信号处理程序。在这种情况下，JVM 信号处理程序执行它的处理；如果安装了此信号的应用程序处理程序，但没有指定 -Xnosigchain 命令行选项，就会调用此信号的应用程序处理程序。

对于异常及错误信号，JVM 将执行下列两种操作之一：

- 处理该情况并进行恢复，或
- 输入受控关闭序列，其中 JVM 将：
  1. 输出 Javadump，以描述故障点上的 JVM 状态
  2. 为该信号调用应用程序的信号处理程序
  3. 调用任何安装的应用程序异常终止挂钩
  4. 执行必要的清除，以提供干净的关闭

关于编写指定以上挂钩的启动程序的信息，请参阅：http://www-106.ibm.com/developerworks/java/library/i-signalhandling/。这是为 Java V1.3.1 编写的，但仍适用于更高版本。

对于中断信号，JVM 还输入一个受控的关闭序列，但是这次它将被视为符合以下条件的正常终止：

- 为该信号调用应用程序的信号处理程序
- 运行所有的应用程序关闭挂钩
- 调用任何安装的应用程序退出挂钩
- 执行必要的 JVM 清除

此关闭与由一个对 Java 方法 `System.exit()` 的调用所启动的关闭相同。

JVM 所使用的其他信号是用于内部控制用途的，并且不会导致该控制终止。唯一关注的控制信号是 SIGBREAK，它将导致生成一个 Javadump。

### JVM 所使用的信号

下面的表 1 显示了 JVM 所使用的信号。 表中按类型或使用情况对信号进行了分组，如下所示：

- 异常：无论何时出现致命情形，操作系统都会同步会发出一个相应的异常信号。
- 错误：如果检测到不能从中恢复的情形，JVM 会发出 SIGABRT。
- 中断：中断信号从 JVM 进程外异步发出以请求关闭。
- 控制：JVM 为控制目的而使用的其他信号。

表 1. JVM 所使用的信号
信号名称 | 信号类型 | 描述 | 是否被 -Xrs 禁用
--- | --- | --- | ---
SIGINT | 中断 | 交互式注意信号（CTRL-C）。JVM 正常退出。 | 是
SIGTERM | 中断 | 终止请求。JVM 将正常退出。 | 是
SIGBREAK | 控制 | 从终端发出的断开信号。JVM 以此来获取 Javadump。 | 是

|IBM JVM 使用结构化异常处理和 SetConsoleCtrlHandler() API。它们是使用 -Xrs 禁用的。-Xnosigchain 在 Windows 上被忽略。

使用 -Xrs（减少信号使用）选项来防止 JVM 处理大多数的信号。要获取更多的信息，请参阅 Sun 的 Java 应用启动程序页面，地址是 http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/java.html。

JVM 线程上的信号 `2（SIGINT）`和 `15（SIGTERM）`导致 JVM 关闭；因此，应用程序信号处理程序不应该尝试从此信号恢复，除非它不再需要 JVM。

### 将本机代码驱动程序链接到信号链接库

Runtime Environment 包含信号链接。信号链接使 JVM 能够更有效的同安装有自己信号处理程序的本机代码进行相互操作。

信号链接使应用程序能够在 msvcrt.dll 之前链接并装入共享库 jsig.dll。jsig.dll 库确保拦截对 `signal()` 的调用，以便它们的处理程序不会替换 JVM 的信号处理程序。反之，这些调用将保存新的信号处理程序，或者将它们“链接”到 JVM 安装的处理程序之后。然后，当这些信号中的任何信号出现且发现不是针对 JVM 时，预先安装的处理程序将被调用。

要使用 jsig.dll，请将它与创建或嵌入 JVM 的应用程序链接。

## 转换 XML 文档

IBM SDK 包含符合 JAXP 1.3 规范的 XSLT4J 处理器和 XML4J 解析器。这些工具使您能够独立于任何给定的 XML 处理实现，解析和转换 XML 文档。通过使用“工厂查找器”查找 SAXParserFactory、DocumentBuilderFactory 和 TransformerFactory 实现，应用程序可以在不同的实现之间交换，而无需更改任何代码。

|IBM SDK 中包含的 XML 技术相似于 Apache Xerces Java 和 Apache Xalan Java。请参阅 http://xml.apache.org/xerces2-j/ 和 http://xml.apache.org/xalan-j/ 以获取更多信息。

XSLT4J 处理器使您能够在原来的 XSLT 解释处理器或新的 XSLT 编译处理器之间进行选择。解释处理器是为工具和调试环境设计的；它支持 XSLT 编译处理器所不支持的 XSLT 扩展功能。XSLT 编译处理器是为高性能运行时环境设计的；它从 XSL 样式表生成一个转换引擎（或称 translet）。这种方法将样式表指示信息的解释和它们在运行时对 XML 数据的应用分隔开来。

XSLT 解释处理器是缺省处理器。要选择 XSLT 编译处理器，您可以：

- 更改 jaxp.properties 文件（位于 C:\Program Files\IBM\Java50\jre\lib 中）中的条目，或
- 将 javax.xml.transform.TransformerFactory 密钥的系统属性设置为 org.apache.xalan.xsltc.trax.TransformerFactoryImpl。

要在 jaxp.properties 文件中实现属性，请将 jaxp.properties.sample 复制到 C:\Program Files\IBM\Java50\ 中的 jaxp.properties。此文件还包含关于用来确定对 TransformerFactory、SAXParserFactory 和 DocumentBuilderFactory 使用哪些实现的过程的完整详细信息。

要提高使用 XSLT 编译处理器转换 StreamSource 对象时的性能，请将 com.ibm.xslt4j.b2b2dtm.XSLTCB2BDTMManager 类指定为服务 org.apache.xalan.xsltc.dom.XSLTCDTMManager 的提供者。要确定服务提供者，请尝试每个步骤，直到找到 org.apache.xalan.xsltc.dom.XSLTCDTMManager：

1. 检查系统属性 org.apache.xalan.xsltc.dom.XSLTCDTMManager 的设置。
2. 在文件 C:\Program Files\IBM\Java50\lib\xalan.properties 中，检查属性 org.apache.xalan.xsltc.dom.XSLTCDTMManager 的值。
3. 在文件 META-INF\services\org.apache.xalan.xsltc.dom.XSLTCDTMManager 的内容中查找类名。
4. 使用缺省服务提供者 org.apache.xalan.xsltc.dom.XSLTCDTMManager。

创建 javax.xml.transform.TransformerFactory 对象时，XSLT 编译处理器将检测到 org.apache.xalan.xsltc.dom.XSLTCDTMManager 服务的提供者。使用 TransformerFactory 对象创建的任何 javax.xml.transform.Transformer 或 javax.xml.transform.sax.TransformerHandler 对象都将使用相同的服务提供者。要更改服务提供者，只能先修改上述某个设置，然后创建新的 TransformerFactory 对象。

### 使用较早版本的 Xerces 或 Xalan

如果您正在使用较早版本的 Tomcat，则可能会有此限制。

如果您在许可的覆盖中使用较早版本的 Xerces（早于 2.0）或 Xalan（早于 2.3），则可能会在启动应用程序时，遇到空指针异常。发生此异常是因为这些较早的版本不能正确处理 jaxp.properties 文件。

为避免这种情况，请使用以下变通方法之一：

- 升级到实现了最新 Java API for XML Programming（JAXP）规范（http://java.sun.com/xml/jaxp/index.html）的较新应用程序版本。
- 从 C:\Program Files\IBM\Java50\jre\lib 除去 jaxp.properties 文件。
- 在 C:\Program Files\IBM\Java50\jre\lib 的 jaxp.properties 文件中取消对条目的注释。
- 使用 IBM_JAVA_OPTIONS 环境变量显式地设置 SAX 解析器、DocumentBuilder 或变换器工厂。例如：

      set IBM_JAVA_OPTIONS=-Djavax.xml.parsers.SAXParserFactory=
        org.apache.xerces.jaxp.SAXParserFactoryImpl

  或

       set IBM_JAVA_OPTIONS=-Djavax.xml.parsers.DocumentBuilderFactory=
        org.apache.xerces.jaxp.DocumentBuilderFactoryImpl

  或

       set IBM_JAVA_OPTIONS=-Djavax.xml.transform.TransformerFactory=
        org.apache.xalan.processor.TransformerFactoryImpl

- 从应用程序代码内部设置 javax.xml.parsers.SAXParserFactory、javax.xml.parsers.DocumentBuilderFactory 或 javax.xml.transform.TransformerFactory 的系统属性。如需查看示例，请参阅 JAXP 1.3 规范。

# 使用 SDK 开发 Java 应用程序

以下几节给出关于使用 SDK for Windows 来开发 Java 应用程序的信息。请参阅 SDK 工具获取可用工具的详细信息。

## 调试 Java 应用程序

要调试 Java 程序，可以使用 Java 调试器（JDB）应用程序或其他使用 SDK for Windows 提供的 Java 平台调试器体系结构（JPDA）进行通信的调试器。

### Java 调试器（JDB）

Java 调试器（JDB）包含在 SDK for Windows 中。该调试器由 jdb 命令调用；它使用 JPDA“连接”到 JVM。要调试 Java 应用程序：

1. 使用以下选项启动 JVM：

       java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=<port>
            MyApp <MyApp args>

2. 此时将启动 JVM，但在它启动 Java 应用程序之前将暂缓执行。您可以在单独的会话中将调试器连接到 JVM：

       jdb -attach <port number>

   调试器将连接到 JVM，您现在可以发出一系列命令来检查和控制 Java 应用程序；例如，输入 `run` 使 Java 应用程序可以执行。

要找到有关 JDB 选项的更多信息，请输入：

    jdb -help

要找到有关 JDB 命令的更多信息：

1. 输入 `jdb`
2. 在 jdb 提示符下，输入 `help`

还可使用 JDB 调试运行在远程机器上的 Java 应用程序。JPDA 使用 TCP/IP 套接字连接到远程 JVM。

1. 象前面一样启动 JVM。
2. 将调试器连接到远程机器：

       jdb -attach  <machine name or ip address>:<port number>

当使用 dt_socket 传送启动调试会话时，确保指定的端口空闲可用。

|Java 虚拟机调试接口（JVMDI）在此发行版中不受支持。它已被 Java 虚拟机工具接口（JVMTI）替换。

要获取有关 JDB 和 JPDA 及其用法的更多信息，请参阅以下 Web 站点：

- http://java.sun.com/products/jpda/
- http://java.sun.com/j2se/1.5.0/docs/guide/jpda/
- http://java.sun.com/j2se/1.5.0/docs/guide/jpda/jdb.html

## 确定应用程序是在 32 位 JVM 还是在 64 位 JVM 上运行

有些 Java 应用程序必须能够确定它们是在 32 位 JVM 还是在 64 位 JVM 上运行。例如，如果应用程序具有本机代码库，对于同时支持 32 位和 64 位操作方式的平台，就必须分别以 32 位和 64 位格式编译该库。在这种情况下，应用程序必须在运行时装入正确的库，因为不能混合 32 位和 64 位代码。

系统属性 com.ibm.vm.bitmode 允许应用程序确定 JVM 运行的方式。它返回以下值：

- 32 － JVM 以 32 位方式运行
- 64 － JVM 以 64 位方式运行

您可以使用以下调用从应用程序代码内部检查 com.ibm.vm.bitmode：

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

## 编写 JNI 应用程序

本机程序可以在 JNI_CreateJavaVM() API 调用上指定的有效 JNI 版本号是：

- JNI_VERSION_1_2(0x00010002)
- JNI_VERSION_1_4(0x00010004)

此版本号仅确定要使用的 JNI 本机接口的等级。创建的 JVM 的实际等级由 J2SE 库指定（即 v5.0）。JNI 接口 API 不影响 JVM 实现的语言规范、类库 API 或 JVM 行为的任何其他领域。有关进一步的信息，请参阅 http://java.sun.com/j2se/1.5.0/docs/guide/jni。

如果应用程序需要两个 JNI 库，一个为 32 位而构建，另一个为 64 位而构建，则请使用 com.ibm.vm.bitmode 系统属性，来确定您正在运行的是 32 位 JVM 还是 64 位 JVM，然后选择适当的库。

注:
不支持版本 1.1 的 Java 本机接口（JNI）。

## 处理 applet

利用 Applet 查看器，您可以使用 APPLET 标记，运行在 Web 页面（HTML 文件）中以引用方式调用的一个或多个 applet。Applet 查看器在 HTML 文件中查找 APPLET 标记，然后如标记所指定，在单独的窗口中运行这些 applet。

因为 Applet 查看器只供查看 applet，所以它无法显示包含许多 HTML 标记的整个 Web 页面。它只解析 Web 页面上的 APPLET 标记，而不解析其他 HTML。

### 使用 Applet 查看器运行 applet

要使用 Applet 查看器运行 applet，请在命令提示符下输入以下命令：

       appletviewer name

其中 name 是以下之一：

- 调用 applet 的 HTML 文件的文件名
- 调用 applet 的 Web 页面的 URL

例如，要在调用 applet 的 HTML 文件上调用 Applet 查看器，请在命令提示符下输入：

    appletviewer <demo>\GraphLayout\example1.html

其中 <demo> 应替换为解压缩演示程序包的完整目标路径。

例如，`http://java.sun.com/applets/NervousText/example1.html` 是调用 applet 的 Web 页面的 URL。要在此 Web 页面上调用 Applet 查看器，请在 shell 提示符下输入：

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

Applet 查看器不识别 <META> 标记的 charset 选项。如果 appletviewer 装入的文件没有按系统缺省值编码，则可能会发生 I/O 异常。为避免该异常，当运行 appletviewer 时，请使用 -encoding 选项。例如：

    appletviewer -encoding JISAutoDetect sample.html

### 使用 Applet 查看器调试 applet

您可以使用 Applet 查看器的 -debug 选项调试 applet。当调试 applet 时，建议您从包含调用该 applet 的 HTML 文件的目录调用 Applet 查看器。例如：

    cd <demo>\TicTacToe
    appletviewer -debug example1.html

其中 <demo> 应替换为解压缩演示程序包的完整目标路径。

您可以在以下 Sun Web 站点找到关于如何使用 Applet 查看器调试 applet 的文档：http://java.sun.com。

| | |

## 配置大页面内存分配

|

您可以通过以 -Xlp 选项启动 Java，在支持大页面的系统上启用大页面支持。

|

使用大页面主要意在为分配许多内存并频繁访问这些内存的应用程序提高性能。 |大页面性能提高主要由转换解析缓冲区（TLB）中减少的未命中数引起。TLB 映射较大的虚拟内存范围，因此产生这种改进。

|

要让 JVM 使用大页面，系统必须有足够数量的连续大页面可用。如果无法分配大页面（甚至当有足够页面可用时），则可能大页面不是连续的。

|

大页面分配只在 JVM 用户的本地管理策略被配置为允许“内存中锁定页”时，才会成功。

## CORBA 支持

Java 2 Platform, Standard Edition（J2SE）至少支持在 J2SE（V1.5）中 CORBA 支持的官方规范中定义的规范。在有些情况下，IBM J2SE ORB 支持更新版本的规范。

### 对 GIOP 1.2 的支持

此 SDK 支持所有版本的 GIOP，如 OMG 文档 formal/99-10-07 的 CORBA 2.3.1 规范第 13 章和第 15 章所定义；该 OMG 文档可从以下地址获取：

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

不支持双向 GIOP。

### 对可移植拦截器的支持

此 SDK 支持可移植拦截器，如 OMG 在文档 ptc/01-03-04 中所定义；可以从以下地址获得该文档：

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

可移植拦截器是伸入 ORB 的挂钩；通过这些挂钩，ORB 服务可以拦截 ORB 的正常执行流。

### 对可互操作命名服务的支持

此 SDK 支持可互操作命名服务，如 OMG 在文档 ptc/00-08-07 中所定义；可以从以下地址获得该文档：

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

在没有给定 ORBInitialPort 参数时瞬态名称服务器（`tnameserv` 命令）使用的缺省端口已经从 900 更改为 2809，而该端口号正是为 CORBA 命名服务向 IANA（Internet Assigned Number Authority，因特网号码分配管理局）注册的端口号。依赖于此缺省值的程序可能必须更新以使用此版本。

从瞬态名称服务器返回的初始上下文现在为 `org.omg.CosNaming.NamingContextExt`。现有的限制对上下文 `org.omg.CosNaming.NamingContext` 引用的程序仍然起作用，而不需要重新编译。

ORB 支持由“可互操作命名服务”规范定义的 -ORBInitRef 和 -ORBDefaultInitRef 参数，而 ORB::string_to_object 操作现在支持由“可互操作命名服务”规范定义的 ObjectURL 字符串格式（corbaloc: 和 corbaname:）。

OMG 指定使用方法 ORB::register_initial_reference 向“可互操作命名服务”注册服务。但是，在 Sun Java 核心 API V5.0 中未提供此方法。需要在当前版本中注册服务的程序必须在 IBM 内部 ORB 实现类上调用此方法。例如，要注册服务“MyService”：

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

其中 `orb` 是从 `ORB.init()` 返回的 `org.omg.CORBA.ORB` 实例，而 `serviceRef` 是连接到 ORB 的 CORBA 对象。这种机制是临时的，并不与将来的版本兼容或可移植到非 IBM ORB 上。

### 用于跟踪 ORB 的系统属性

这是提高可维护性的运行时调试功能部件。您可能发现它对于问题诊断很有用，或者 IBM 服务人员可能请求提供它。跟踪由三个系统属性控制。

- 要打开跟踪，请设置 `com.ibm.CORBA.Debug=true`。
- 要将发送和接收的 GIOP 消息格式化并添加到跟踪，请设置 `com.ibm.CORBA.CommTrace=true`。缺省情况下，ORB 跟踪转到名称格式为 orbtrc.DDMMYYYY.HHmm.SS.txt 的文件。
- 要将它发送到不同的文件，请设置 `com.ibm.CORBA.Debug.Output=<filename>`。

例如，要跟踪事件和格式化的 GIOP 消息，请输入：

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

请勿打开对正常操作的跟踪，因为它可能会导致性能下降。即使您关闭了跟踪，FFDC（First Failure Data Capture，首次故障数据捕获）仍保持工作，这样就只报告严重错误。如果有调试输出文件生成，请检查该文件中的问题。例如，服务器可能没有执行 ORB.shutdown() 就停止了。

跟踪输出的内容和格式可能随版本而有所不同。

### 用于调整 ORB 的系统属性

以下属性帮助您调整 ORB：

- 要控制 GIOP 1.2 分段，请设置系统属性 com.ibm.CORBA.FragmentSize。

  例如，要将分段大小设置为 4096 字节：

      java -Dcom.ibm.CORBA.FragmentSize=4096 myapp

  缺省分段大小为 1024 字节。您可以通过将分段大小设置为 0，关闭分段。

- 在异构网络中，对 CORBA 请求的响应可能延迟或丢失。您可以使用系统属性 com.ibm.CORBA.RequestTimeout 设置要等待的最长时间。您还可以使用 com.ibm.CORBA.LocateRequestTimeout 来控制 LocateRequests 的超时。例如，要将两个延迟都限制为 30 秒，请输入：

      java -Dcom.ibm.CORBA.RequestTimeout=30
           -Dcom.ibm.CORBA.LocateRequestTimeout=30 myapp

  缺省情况下，ORB 无限期地等待响应。请勿将超时设置得太低，否则连接可能会不必要地结束。

- 如果程序正在网络上提供服务，您可能必须将 ORB 从其读取入局请求的端口号设置为一个众所周知的值。您可以使用系统属性 com.ibm.CORBA.ListenerPort 控制此项。

  例如，要让 ORB 使用端口 1050，请输入：

      java -Dcom.ibm.CORBA.ListenerPort=1050 myapp

  如果设置了此属性，ORB 在初始化后，就会立即开始侦听。否则，只在要求时，它才开始侦听。

### ORB 的 Java 2 安全许可权

当与 Java 2 SecurityManager 一起运行时，对 CORBA API 类中某些方法的调用可能导致进行许可权检查，而可能产生 SecurityExeption。受影响的方法包括以下几个：

表 2. 当与 Java 2 SecurityManager 一起运行时受影响的方法
类／接口 | 方法 | 需要的许可权
--- | --- | ---
org.omg.CORBA.ORB | init | java.net.SocketPermission resolve
org.omg.CORBA.ORB | connect | java.net.SocketPermission listen
org.omg.CORBA.ORB | resolve_initial_references | java.net.SocketPermission connect
org.omg.CORBA. portable.ObjectImpl | _is_a | java.net.SocketPermission connect
org.omg.CORBA. portable.ObjectImpl | _non_existent | java.net.SocketPermission connect
org.omg.CORBA. portable.ObjectImpl | OutputStream _request (String, boolean) | java.net.SocketPermission connect
org.omg.CORBA. portable.ObjectImpl | _get_interface_def | java.net.SocketPermission connect
org.omg.CORBA. Request | invoke | java.net.SocketPermission connect
org.omg.CORBA. Request | send_deferred | java.net.SocketPermission connect
org.omg.CORBA. Request | send_oneway | java.net.SocketPermission connect
javax.rmi. PortableRemoteObject | narrow | java.net.SocketPermission connect

如果程序使用这些方法中的任何一个，请确保它被授予必要的许可权。

### ORB 实现类

此发行版中的 ORB 实现类是：

- org.omg.CORBA.ORBClass=com.ibm.CORBA.iiop.ORB
- org.omg.CORBA.ORBSingletonClass=com.ibm.rmi.corba.ORBSingleton
- javax.rmi.CORBA.UtilClass=com.ibm.CORBA.iiop.UtilDelegateImpl
- javax.rmi.CORBA.StubClass=com.ibm.rmi.javax.rmi.CORBA.StubDelegateImpl
- javax.rmi.CORBA.PortableRemoteObjectClass= com.ibm.rmi.javax.rmi.PortableRemoteObject

这些是缺省值，建议您不要设置这些属性或直接引用这些实现类。出于可移植性，请只引用 CORBA API 类，而不要引用实现。在将来的发行版中可能更改这些值。

## RMI over IIOP

Java 远程方法调用（RMI）提供一种简单的机制来执行分布式 Java 编程。RMI over IIOP（RMI-IIOP）使用“公共对象请求代理体系结构”（CORBA）标准“因特网 ORB 间协议”（IIOP 协议）来扩展基本 Java RMI 执行通信。这允许与任何其他 CORBA“对象请求代理”（ORB）直接进行交互，而无论它们是以 Java 编程语言还是以另一种编程语言实现的。

可获取以下文档：

- RMI-IIOP Programmer's Guide 提供有关编写 RMI-IIOP 程序的介绍。当您安装本文档时，会附带安装该指南。
- 演示目录包含：
  - 可以在 Java 远程方法协议（JRMP）和 IIOP 协议之间切换的“Hello World”示例（demo\rmi-iiop\hello）
  - 与标准 IDL 程序（demo\rmi-iiop\idl）交互的“Hello World”示例
- Java Language to IDL Mapping 文档提供详细的 RMI-IIOP 技术规范；该文档可以在以下地址找到：
  http://www.omg.org/cgi-bin/doc?ptc/00-01-06.pdf

## 实现 RMI 的连接处理程序池

缺省情况下，不启用 RMI 连接处理程序的线程池。

要启用在 RMI TCPTransport 级别实现的连接池，请设置选项

    -Dsun.rmi.transport.tcp.connectionPool=true（或任何非空的值）

此版本的 Runtime Environment 不具有可以用来限制连接池中线程数的任何设置。

要获取更多信息，请参阅 Sun Java 站点：http://java.sun.com。

## 增强的 BiDirectional 支持

IBM SDK 包含增强的 BiDirectional 支持。有关更多信息，请参阅 http://www-106.ibm.com/developerworks/java/jdk/bidirectional/index.html。用于 BiDirectional 程序包的 Javadoc 随 SDK 提供在 docs/apidoc.zip 文件中。

## 增强的 BigDecimal

| |

从 Java 5.0 开始，IBM BigDecimal 类已被 Sun 作为 java.math.BigDecimal 采用。IBM 不再维护 com.ibm.math.BigDecimal，因此它被标记为不提倡使用。建议您迁移现有的 Java 代码来使用 java.math.BigDecimal。

|

新的 java.math.BigDecimal 使用与先前的 java.math.BigDecimal 和 com.ibm.math.BigDecimal 相同的方法。使用 java.math.BigDecimal 的现有代码继续正确工作。

|

要迁移现有的 Java 代码来使用 java.math.BigDecimal 类，请将 java 文件顶部的 import 语句从 `import com.ibm.math.*;` 更改为 `import java.math,*;`。

## 欧元符号支持

IBM SDK 和 Runtime Environment 设置欧元从 2002 年 1 月 1 日开始作为欧洲货币联盟（EMU）中那些国家或地区的缺省货币。

要使用原有的国家或地区标准货币，请在 Java 命令行上指定 `-Duser.variant=PREEURO`。

如果您正在运行英语、丹麦语或瑞典语语言环境并要使用欧元，请在 Java 命令行上指定 `-Duser.variant=EURO`。

# 使用 Java Communications API（JavaComm）

Java Communications 应用程序编程接口（API）程序包（JavaComm）是一个可选程序包，可与 Runtime Environment for Windows 一起使用。JavaComm 独立于 SDK 或 Runtime Environment 安装。

JavaComm API 为 Java 应用程序提供了一种独立于平台的方式，来为语音邮件、传真和智能卡等技术执行串行和并行端口通信。在为应用程序编写串行或并行端口通信之后，接着可以随应用程序包含这些文件。

Java Communications API 支持“电子工业协会”（EIA）-232（RS232）串行端口和“电气电子工程师学会”（IEEE）1284 并行端口，并在装有 IBM Version 5.0 Runtime Environment 的系统上受到支持。

使用 Java Communications API，您可以：

- 列出系统上的端口
- 打开和宣称端口所有权
- 解决在使用 Java Communications API 的应用程序之间的端口所有权争用问题
- 通过事件通知，执行异步和同步 I/O 端口监视
- 在端口上接收描述状态更改的 bean 样式事件

## 安装 Java Communications API

您应该确保在安装 Java Communications API 之前安装了 SDK 或 Runtime Environment 副本。

要从 zip 文件安装 Java Communications API：

1. 将 Java Communications API zip 文件 ibm-java2-javacomm-50-win-i386.zip 放在安装 SDK 或 Runtime Environment 的目录中。如果先前安装到了缺省目录，则它是 C:\Program Files\IBM\Java50\。
2. 解压缩文件。这些文件解压缩如下：
   - jre\lib\ext\comm.jar
   - jre\bin\ibmcomm.dll
   - jre\lib\javax.comm.properties
   - docs\javacomm\License.html

   如果您先前在安装 Runtime Environment 时接受了缺省目录，则 comm.jar 文件在 C:\Program Files\IBM\Java50\jre\lib\ext 中。

   如果在另一个目录中解压缩文件，则文件按照相同的目录结构放置，但 C:\Program Files\IBM\Java50\ 替换为您解压缩文件的目录。

## 配置 Java Communications API

在安装 Java Communications API 之后，您必须：

- 更改串行和并行端口的访问方式。
- 如果在安装 Java 时没有设置 PATH，则设置它。请参阅设置 PATH。

## Java Communications API 的打印局限性

当使用 Java Communications API 打印时，您可能必须按下“进纸”或“继续”或者打印机上的类似按键。

## 卸载 Java Communications API

要卸载 Java Communications API，请从安装 Runtime Environment 的目录删除以下文件：

- jre\lib\ext\comm.jar
- jre\bin\ibmcomm.dll
- jre\lib\javax.comm.properties
- docs\javacomm\License.html

缺省情况下，Runtime Environment 安装在 C:\Program Files\IBM\Java50\ 目录中。

## Java Communications API 文档

您可以在以下 Sun Web 站点上找到 API 文档和 Java Communications API 的样本：http://java.sun.com。

# 部署 Java 应用程序

## 使用 Java Plug-in

Java Plug-in 是一个 Web 浏览器插件。如果使用 Java Plug-in，可以绕过 Web 浏览器的缺省 JVM，并改为使用您所选择的 Runtime Environment 在浏览器中运行 applet 或 bean。

必须允许 applet 完成装入以防止浏览器“挂起”。例如，如果您在装入 applet 时使用后退按钮，然后使用前进按钮，则可能无法装入 HTML 页面。

在 Sun 的以下站点提供了 Java Plug-in 的文档：http://java.sun.com/j2se/1.5.0/docs/guide/plugin/developer_guide/。

### 支持的浏览器

|

|表 3. Java Plug-in 支持的浏览器
|操作系统 | |Internet Explorer | |Netscape | |Mozilla
--- | --- | --- | ---
|Windows 2000 | |5.5 SP2，6.0 | |4.78, 6.2.2, 7.2 | |1.4.x, 1.5.x, 1.6.x, 1.7.x, Firefox 1.0.x
|Windows XP | |6.0 | |4.78, 6.2.2, 7.2 | |1.4.x, 1.5.x, 1.6.x, 1.7.x, Firefox 1.0.x
|Windows Server 2003 | |6.0 | |4.78, 6.2.2, 7.2 | |1.4.x, 1.5.x, 1.6.x, 1.7.x, Firefox 1.0.x

|

请注意，Windows 2000 上的缺省浏览器 Internet Explorer 5.01 不受支持。

### 公共文档对象模型（DOM）支持

由于特定浏览器的限制，可能无法实现 org.w3c.dom.html 数据包的所有函数。

- 对于其中某些函数，会抛出 sun.plugin.dom.exception.NotSupportedException。
- 当浏览器不支持特定的函数时，抛出 sun.plugin.dom.exception.InvalidStateException。

### 使用 DBCS 参数

Java Plug-in 支持双字节字符（例如繁体中文 BIG-5、韩国语、日语）作为 `<APPLET>`、`<OBJECT>` 和 `<EMBED>` 标记的参数。必须为 HTML 文档选择正确的字符编码，以便 Java Plug-in 可以分析此参数。通过在 `<HEAD>` 部分中使用 `<META>` 标记，可以为 HTML 文档指定字符编码，如下所示：

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

此示例告诉浏览器使用中文 BIG-5 字符编码分析正在使用的 HTML 文件。所有参数都正确地传递到 Java Plug-in。但是，某些较早的浏览器版本可能无法正确理解此标记。在这种情况下，可以强制浏览器忽略此标记，但您可能不得不手工更改编码。

您可以指定希望使用哪个编码来分析 HTML 文件：

- Internet Explorer 5/6“查看”菜单 -> 编码
- Netscape 4：“查看”菜单 -> 字符集
- Netscape 6：“查看”菜单 -> 字符编码

## 使用 Web Start

您可以使用 Java Web Start 来部署 Java 应用程序。Web Start 使用户能够从 Web 直接启动和管理应用程序。使用 Java Web Start 可以很容易地从 Web 启动应用程序，这样可以确保运行的是最新版本，从而避免了安装和升级的过程。Java Web Start 除去了下载和安装软件的必要，从而绕过冗长的安装选项。

|除记录在 http://java.sun.com/j2se/1.5.0/docs/guide/javaws/developersguide/syntax.html#resources 上的 java-vm-args 以外，Web Start 还支持使用 -Xgcpolicy 来设置垃圾回收策略。

要获取有关支持 Web Start 的浏览器的信息，请参阅支持的浏览器。

要获取有关 Web Start 的更多信息，请参阅：http://java.sun.com/products/javawebstart 和 http://java.sun.com/j2se/1.5.0/docs/guide/javaws/index.html。要获取有关部署应用程序的更多信息，请参阅：http://java.sun.com/j2se/1.5.0/docs/guide/deployment/index.html。

### 运行 Web Start

您可以通过三种方式调用 Web Start：

1. 在引用 .jnlp 文件的 Web 页面上选择一个链接。
2. 在命令提示符下，输入 `javaws <URL>`，其中 `<URL>` 是 .jnlp 文件的位置。
3. |如果已使用 Java Web Start 打开应用程序，请从 jre\bin 目录运行 javaws，启动 Java 应用程序高速缓存查看器。

应用程序下载之后将存储在 Java 应用程序高速缓存中。如果再次访问该应用程序，Java Web Start 将下载该应用程序的最近版本（如果可用）；如果没有，则使用高速缓存的版本。

如果在 .jnlp 文件中发生错误（如无效的标记名称），则 Web Start 失败，而不显示错误消息。

## 发布 Java 应用程序

Java 应用程序不象 Java applet，不能依赖 Web 浏览器提供安装和运行时服务。当发布 Java 应用程序时，软件包可能包含以下几部分：

- 您自己的类、资源和数据文件
- 安装过程或程序

用户需要 Runtime Environment for Windows，才能运行应用程序。SDK for Windows 软件包含 Runtime Environment。但是，您不能假定用户已经安装了 SDK for Windows 软件。

SDK for Windows 软件许可证不允许您随应用程序重新分发任何 SDK 文件。您应该确保在目标机器上安装了 SDK for Windows 的许可版本。

| | |

# JVM 之间的类数据共享

|

IBM 虚拟机（VM）使您能够通过将引导程序和应用程序类存储在共享内存的高速缓存中，来在 VM 之间共享它们。当多个 VM 共享一个高速缓存时，类共享可降低整体的虚拟内存耗用。当创建高速缓存后，类共享还降低 VM 的启动时间。共享类高速缓存独立于任何活动的 VM，并且持续存在时间超过启动高速缓存的 VM 的生存期。

| |

## 类共享概述

|

IBM SDK 使您能够在对于用户保持透明的同时共享尽可可能多的类。

| |

### 高速缓存内容

|

共享类高速缓存包含描述类的只读静态类数据和元数据。任何 VM 都可以读取或更新该高速缓存。正在共享的 VM 必须处在相同的发行版。如果正在使用运行时字节码修改，则您必须小心。（请参阅运行时字节码修改。）

| |

### 高速缓存的动态更新

|

因为共享类高速缓存持续存在时间超过任何 VM 的生存期，所以会动态更新该高速缓存，来反映任何可能在文件系统上已对 JAR 或类作出的修改。动态更新使高速缓存对于使用它的应用程序保持透明。

| |

### 启用类共享

|

通过在启动 VM 时使用 -Xshareclasses 选项，启用类共享，来使 VM 连接到现有高速缓存或创建一个高速缓存（如果不存在）。缺省情况下，VM 装入的所有引导程序和应用程序类都被共享。如果定制类装入器扩展了应用程序类装入器，则会自动共享；否则，它们必须使用随 VM 提供的 Java 助手 API 来访问高速缓存。（请参阅修改定制类装入器来共享类。）

| |

### 高速缓存安全性

|

对共享的类高速缓存的访问权受限于操作系统许可权和 Java 安全许可权。只有已注册到共享类的类装入器才能向共享的类高速缓存添加类。如果已装有 Java SecurityManager，则类装入器（除了缺省引导程序、应用程序和扩展类装入器）必须有权共享类。可通过向 java.policy 文件添加 SharedClassPermission 的方法向类装入器授予许可权。（请参阅使用 SharedClassPermission。）RuntimePermission“createClassLoader”对创建新的类装入器有所限制，因此也对访问高速缓存有所限制。

| |

### 高速缓存生存时间

|

一个系统上可以存在多个高速缓存；这些高速缓存是通过将名称作为 -Xshareclasses 命令的子选项来指定的。一个 VM 任何一次都只能连接到一个高速缓存。您使用 -Xscmx<n>[k|m|g] 在启动时指定高速缓存大小，但在该高速缓存的生存期内都将固定使用此大小。高速缓存将一直存在，直到使用 -Xshareclasses 命令的子选项明确地破坏它们为止，或者直到系统重新引导为止。

| |

### 高速缓存实用程序

|

所有高速缓存实用程序都是 -Xshareclasses 命令的子选项。使用 -Xshareclasses:help 可查看可用子选项的列表。

| |

## 使用命令行选项控制类共享

|

类共享是使用 -Xshareclasses 和 -Xscmcx 命令行选项启用和配置的。

|

|
- -Xscmx<size>[k|m|g] |
  |
  - 指定高速缓存大小。只有在要创建高速缓存并且不存在同名高速缓存时，此选项才适用。缺省高速缓存大小是视平台而定的。可以通过将 -verbose:sizes 添加为命令行参数来确定正在使用的大小值。最小高速缓存大小为 4 KB。最大高速缓存大小也是视平台而定的。（请参阅高速缓存大小限制。）
|
- -Xshareclasses:<suboption1>[,<suboption2>...] |
  |
  - 启用类共享。可以使用很多子选项，其中一些是高速缓存实用程序。高速缓存实用程序对指定的高速缓存执行必需的操作，而不启动 VM。您可以结合使用多个子选项（以逗号分隔），但高速缓存实用程序是互斥的。
  您可以随 -Xshareclasses 选项使用以下子选项，例如 -Xshareclasses:help |
  |
  - help |
    |
    - 列出所有命令行选项。
  |
  - name=<name> |
    |
    - 连接到给定名称的高速缓存，如果高速缓存不存在则创建它。使用 listAllCaches 实用程序选项来显示当前哪些高速缓存是可用的。如果不指定名称，则将使用缺省名称“sharedcc_”并附加当前的用户名来创建高速缓存名称。
  |
  - verbose |
    |
    - verbose 给出有关高速缓存 I/O 活动的详细输出，其中列出正在存储和找到的类的信息。每个类装入器都被给定一个唯一的标识（引导程序装入器始终为 0），并且输出显示在工作的类装入器层次结构；在该层次结构中，类装入器必须向它们的父代请求类之后，才能自行装入该类。看到很多失败的请求是正常的；这种行为是类装入器层次结构所预期会出现的。请注意，如果启用类共享，则标准选项 -verbose:class 还将启用类共享详细输出。
  |
  - modified=<modified context> |
    |
    - 如果安装了可能在运行时修改字节码的字节码代理程序，则此选项是必需的。如果不指定此选项而安装了字节码代理程序，则将不会在高速缓存中存储或找到任何类。<modified context> 是一个由用户选择的描述符；例如“myModification1”。它对高速缓存进行分区，这样只有使用上下文 myModification1 的 JVM 才能共享相同的类。例如，如果以某个修改上下文运行“HelloWorld”，然后以不同的修改上下文再次运行它，您就会看到所有的类将在高速缓存中存储两次。
  |
  - destroy（实用程序选项） |
    |
    - 破坏使用在 name=<name> 子选项中指定的名称的那个高速缓存。如果未指定名称，则破坏缺省高速缓存。只有在使用某个高速缓存的所有 VM 都已关闭，并且用户具有充分的许可权时，才能破坏该高速缓存。
  |
  - destroyAll（实用程序选项） |
    |
    - 尝试破坏所有对于用户可用的高速缓存。只有在使用某个高速缓存的所有 VM 都已关闭，并且用户具有充分的许可权时，才能破坏该高速缓存。
  |
  - expire=<time in minutes>（实用程序选项） |
    |
    - 破坏所有未使用时间达到指定时间的高速缓存。
  |
  - listAllCaches（实用程序选项） |
    |
    - 列出系统上的所有高速缓存，描述它们是否正在使用以及上次是何时使用的。
  |
  - printStats（实用程序选项） |
    |
    - 显示有关在 name=<name> 子选项中指定的高速缓存的摘要统计信息。如果未指定名称，则将显示有关缺省高速缓存的统计信息。显示的最有用的信息是该高速缓存的充满程度以及它包含多少数量的类。请注意，“陈旧”类是文件系统上已经更新而因此被高速缓存标为“陈旧”的类。不会从高速缓存清除陈旧类。请参阅 Diagnostics Guide 获取更多信息。
  |
  - printAllStats（实用程序选项） |
    |
    - 显示有关在 name=<name> 子选项中指定的高速缓存内容的详细信息。如果未指定名称，则将显示有关缺省高速缓存的统计信息。每个类都按时间顺序列出，同时指出装入该类的来源位置。请参阅 Diagnostics Guide 获取更多信息。

| |

## 创建、植入、监视和删除高速缓存

|

要启用类共享，请将 -Xshareclasses[:name=<name>] 添加到应用程序命令行中。VM 将连接到给定名称的现有高速缓存，或创建该名称的新高速缓存。如果已经创建了一个新的高速缓存，则将会给它植入所有装入的引导程序和应用程序类，直至高速缓存变满为止。如果并行启动了两个或更多 VM，它们都将并行植入该高速缓存。

|

要检查是否已经创建了高速缓存，请运行 `java -Xshareclasses:listAllCaches`。要查看正在共享多少类和类数据，请运行 `java -Xshareclasses:[name=<name>],printStats`。（可以在终止应用程序 VM 后或在另一个命令窗口中运行这些实用程序）

|

要查看从高速缓存装入或存储在高速缓存中的类，请将 `-Xshareclasses:[name=<name>],verbose` 添加到应用程序命令行中。

|

要删除创建的高速缓存，请运行 `java -Xshareclasses:[name=<name>],delete`。仅当高速缓存包含很多陈旧类，或高速缓存已满而需要创建一个更大的高速缓存时，才应该删除高速缓存。

|

建议调整高速缓存大小以适合您的具体应用程序，因为缺省大小不太可能是最合适的大小。确定最合适的高速缓存大小的最好方法就是指定一个较大的高速缓存（使用 -Xscmx），运行该应用程序，然后使用 printStats 确定存储了多少类数据。再向 printStats 中显示的值添加一个较小的数值，以防意外情况出现。请注意，因为在 VM 的生存期内的任何时间都可能有类装入，所以最好在应用程序终止后再执行此分析。但是，由于高速缓存已满对与之连接的任何 VM 的性能或功能不会有负面影响，因此将高速缓存的大小设置得比实际所需小一些是非常合理的。

|

如果高速缓存已满，一条消息将会输出到所有使用该高速缓存的 VM 的命令行上，然后这些 VM 将会向它们自己的进程内存再装入一些类。在已满的高速缓存中的类仍然能够共享，但已满的高速缓存是只读的，而无法使用新类进行更新。

| |

## 性能和内存消耗

|

类共享对于使用多个运行相似代码的 VM 的系统尤为有用；系统能够从虚拟内存消耗的减少中获益。它还在频繁启动和关闭 VM 的系统上很有用（获益于启动时间的改进）。

|

创建和植入新高速缓存的开销非常小。根据装入的类的数量，一个 VM 的启动时间花费一般在 0 到 5% 之间。根据操作系统和装入类的数量，使用植入的高速缓存后，VM 启动时间通常会减少 10% 到 40%。并发运行多个 VM 将带来更大的整体启动时间获益。

|

当使用类共享运行应用程序时，可以使用操作系统工具来看到虚拟内存消耗的减少。

| |

## 使用类共享的局限性和注意事项

| |

### 高速缓存大小限制

|

理论上说，最大的高速缓存大小是 2GB。高速缓存将受以下因素的限制：

|

|

|
- 可用磁盘空间。在磁盘上将创建一个用来存储类数据的文件，它位于用户概要文件下的“javasharedresources”目录中。通常，此目录设置为 C:\Documents and Settings\<username>\Application Data\。每次重新启动 Windows 就会删除一次该文件。
|
- 可用虚拟地址空间。由于进程的虚拟地址空间是在共享类高速缓存和 Java 堆之间共享的，因此增大 Java 堆的最大大小将会降低可以创建的共享类高速缓存的大小。

| |

### 运行时字节码修改

|

任何使用可修改字节码的 JVMTI 代理的 VM 都无法共享类，除非在命令行上使用 modified=<modified_context> 子选项（见上方）。修改的上下文是一个由用户指定的描述符，它描述所执行修改的类型。所有使用给定修改上下文的 VM 都必须为每个类以可预测的、可重复的方式修改字节码，这样存储在高速缓存中的、经过修改的类在由另一个 VM 装入时就有预期的修改。任何修改都必须可预测的原因是：代理无法重新修改从共享类高速缓存装入的类。请注意，经过修改和未经过修改的字节码可以存储在同一个高速缓存中。请参阅 Diagnostics Guide 获取更多有关此主题的详细信息。

| |

### 操作系统局限性

|

对于既可以运行 32 位应用程序也可以运行 64 位应用程序的操作系统，不允许在 32 位和 64 位 VM 之间实行类共享。根据正在使用的 VM 的地址方式，listAllCaches 子选项将列出 32 位或 64 位高速缓存。

|

共享类高速缓存需要磁盘空间来存储有关存在于系统上的高速缓存的标识信息。此信息位于用户概要文件目录中。如果删除了该标识信息目录，VM 将无法识别系统上的共享类，这样就必须重新创建高速缓存。

|

访问共享类高速缓存的许可权是由操作系统强制实行的。如果未指定高速缓存名称，则将把用户名附加到缺省名称后，这样同一个系统上的多个用户就在缺省情况下创建他们自己的高速缓存。

| |

### 使用 SharedClassPermission

|

如果 SecurityManager 的使用结合了类共享，并且正在运行的应用程序使用的是它自己的类装入器，则这些类装入器只有在授予了 SharedClassPermission 后，才能共享类。您必须使用类装入器类名（允许使用通配符），同时使用“read”、“write”或“read,write”确定授予的访问权，来将 SharedClassPermission 添加到 java.policy 文件。例如：

|

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

如果类装入器不具有正确的 SharedClassPermission 但却尝试共享类，则 AccessControlException 将被抛出。不可更改或降低缺省引导程序、应用程序或扩展类装入器的许可权。

| |

## 修改定制类装入器来共享类

|

大多数 Java 应用程序都将使用 VM 自己的类装入器，或将使用扩展 java/net/URLClassLoader 的定制类装入器。使用这些类装入器的应用程序将能够自动共享引导程序和应用程序类。不扩展 java/net/URLClassLoader 的定制类装入器将需要修改来使用类共享。如果正在使用 SecurityManager，则应该向所有的定制类装入器授予 SharedClassPermission，请参阅使用 SharedClassPermission。IBM 为各种类型的定制类装入器提供了几个 Java 接口，使类装入器能够在共享类高速缓存中找到和存储类。这些类包含在 com.ibm.oti.shared 程序包中。用于该程序包的 Javadoc 随 SDK 提供在 docs/apidoc.zip 文件中。请参阅 Diagnostics Guide 获取有关如何使用这些接口的更多信息。

# 为独立软件供应商提供的服务和支持

如果您有权按照 IBM 解决方案开发商计划接受有关程序代码的服务，请以常规访问方法或在 Web 站点 http://www-1.ibm.com/partnerworld/ 联系 IBM 解决方案开发商计划。

如果您已经购买了服务合同（即 IBM 的个人系统支持热线或者按所在国家／地区提供的同等服务），则该服务合同的条款和条件将确定您在这个计划下有权接受什么服务（如果有的话）。

# 辅助功能选项

随此 SDK 和 Runtime Environment 提供的《用户指南》已使用屏幕阅读器进行过测试。您可以使用诸如 Home Page Reader 或 JAWS 屏幕阅读器的屏幕阅读器阅读这些《用户指南》。

要更改《用户指南》中的字体大小，请使用随浏览器提供的功能，通常可以在视图菜单选项下找到。

对于需要使用键盘导航的用户，可在 http://www-128.ibm.com/developerworks/java/jdk/additional/ 处的“Swing Key Bindings”中找到关于 Swing 应用程序的有效击键的描述

## iKeyman 辅助功能选项

|除了 GUI，iKeyman 工具还提供了命令行工具 IKEYCMD，它与 iKeyman GUI 的功能相同。IKEYCMD 使您能够管理密钥、证书和证书请求。当应用程序需要向证书和密钥管理任务添加定制界面时，您可以从本机 shell 脚本以及从要使用的程序调用 IKEYCMD。IKEYCMD 可以创建 iKeyman 当前支持的所有类型密钥数据库文件。IKEYCMD 还能够创建证书请求、导入 CA 签署的证书以及管理自签署证书。

要运行 IKEYCMD 命令，请输入：

    java [-Dikeycmd.properties=<properties file>]com.ibm.gsk.ikeyman.ikeycmd
    <object> <action> [options]

其中：

<object>
  是以下之一：
  -keydb
    对密钥数据库（CMS 密钥数据库文件、WebDB 密钥环文件或 SSLight 类）执行的操作
  -cert
    要对密钥数据库中的证书执行的操作
  -certreq
    要对密钥数据库中的证书请求执行的操作
  -version
    显示 IKEYCMD 的版本信息
  -help
    显示 IKEYCMD 调用的帮助。
<action>
  |要在对象上执行的特定操作。要查看可对某一对象执行的操作，请只传递该对象作为参数，来调用 IKEYCMD。将显示上下文相关的帮助，列出可对该对象执行的操作。
-Dikeycmd.properties
  指定要用于此 Java 调用的可选属性文件的名称。缺省属性文件 ikeycmd.properties 作为一个样本文件提供，该文件可以被任意 Java 应用程序更改和使用。

注:
对象和操作关键字必须以指定的顺序排列。但是，选项是无位置的，因此在它们被指定为选项和操作数对时，可以按照任何顺序排列。

要获取更多信息，请参阅 http://www.ibm.com/developerworks/java/jdk/security/index.html 处的 iKeyman User Guide。

## Swing 中 JComboBox 组件的键盘遍历

如果使用光标键遍历 JComboBox 组件的下拉列表，则组合框的按钮或可编辑字段不更改值，直到选择某项为止。这是此发行版的期望行为，这样可以通过确保键盘遍历行为与鼠标遍历行为一致，来改善辅助功能选项和提高可用性。

## Web Start 辅助功能选项

IBM Java Web Start v5.0 包含几项在先前发行版基础上的辅助功能选项改善和可用性提高，包括对屏幕阅读器的更好支持和改进的键盘导航。

您只使用命令行，就可以启动支持 Web Start 的 Java 应用程序。要更改首选项，必须在用户的主目录中编辑配置文件 Application Data\IBM\Java\Deployment\deployment.properties。编辑此文件之前，请制作备份。不是可以在 Java 应用程序高速缓存查看器中设置的所有首选项都提供在该可以在 Java 应用程序高速缓存查看器中设置的所有首选项并非都可在该配置文件中使用。

# 有关安全性的一般注释

您可以从 http://www.ibm.com/developerworks/java/jdk/security/index.html 获取 JCE 无限制管辖策略文件。有关 IBM 安全性程序包 JCE、JCEFIPS、JSSE2、JSSEFIPS、JGSS、JAAS 和硬件密码术的文档也可从此 Web 站点获取。

# 已知局限性

请注意 IBM 32-bit SDK for Windows, v5.0 中的以下局限性：

- IBM 32-bit SDK for Windows, v5.0 支持以下语言环境：
  - 孟加拉语（bn_IN）
  - 马拉雅拉姆语（ml_IN）
  - 奥里雅语（or_IN）
  但这些语言环境的字体可能无法在 AWT 组件上显示。

- IBM 32-bit SDK for Windows, v5.0 支持 IPv6。|但是，因为 Windows 中的当前 IPv6 支持不是双堆栈的，所以 SDK 会在启用 IPv6 的系统上仿真双堆栈行为。由于仿真的本质，Java 应用程序可能会使用多达两倍的套接字。要禁用此仿真，请将系统属性 java.net.preferIPv4Stack 设置为 `true`，以在 SDK 中禁用 IPv6 支持。

- 当使用输入法编辑器（IME）时，建议您在使用工作区进行任何其他操作之前完成字符构成操作以及候选字的选择。

- 创建不常用长度的 DSA 密钥对可能在运行缓慢的机器上花费大量时间。该延迟不应认为是挂起，因为如果运行足够的时间，这个进程是会完成的。现在已经优化了 DSA 密钥生成算法来生成标准的密钥长度（例如 512 和 1024），这比其他密钥长度要迅速很多。

- 个人防火墙可能导致 Windows NIO 代码出现问题，引起特定操作的失败。例如，Selector.open() 方法调用可能因 `java.net.ConnectException: Connection refused: connect` 而抛出 `java.io.IOException: Unable to establish loopback connection`。该异常是由在防火墙阻塞的端口上进行连接的操作系统导致的。JVM 将重试连接操作，要求操作系统选择一个不同的端口号。如果在若干次重试之后仍无法连接，则抛出 `ConnectException`。

  如果看见此异常，可以设置系统属性 java.nio.debug=pipe 来查看哪些端口号正被阻塞。

- 如果在使用 IME 的同时，用户在 AWT 文本区域输入文本，然后在提交文本之前调整应用程序窗口，则文本会自动提交。

- 在 Windows 2000 和 XP 上，可以同时打开的文件数量的缺省值太低，这导致 I/O 密集的应用程序出现问题。要修正此限制，请编辑文件 <windows>\system32\CONFIG.NT 并设置以下值：
  - `files=200`
  - `buffers=60`
  其中 <windows> 是安装 Windows 的目录。

- 在 Windows 2000（使用 32 位彩色深度）上，JVM 的 DirectDraw 机制不重新绘制鼠标指针下的区域。结果是菜单上如果放置了鼠标就会出现灰色或黑色方块。变通方法是关闭直接绘画（`-Dsun.java2d.noddraw`），或将屏幕颜色分辨率更改为某个其他值，如 256 色。

- 当将 PKCS 11 本机库安装到 V1.4.X JVM 上时，必须将该库与其他 JRE 本机库一起放入 JRE bin 目录中。

- NIO SocketChannel finishConnect() 调用可能返回 `true`（通道已连接）或 `false`（连接进程尚未完成），或者抛出异常。在 Windows 2000 上使用无阻塞连接时，尽管先前的 java select() 调用已表示通道可用于处理，也可能返回 `false`。

- 您不能改变运行时 Java 主线程（也称为原始线程）的堆栈范围。主线程固定大小为 256 KB，该值是从性能出发确定的最佳值。您可以使用 -Xss 选项仅修改除主线程以外的其他线程的堆栈范围。由于主线程存在此固定大小，因此建议您不要给它强加繁重的循环活动，因为主线程比其他线程更容易出现堆栈溢出。

- 如果您正在 JTextArea、JTextField 或 JFileChooser 中输入 DBCS 字符，则从某些中文输入法编辑器（尤其是，中文内码与郑码）切换到智能 ABC 输入法编辑器可能会导致核心转储的产生。

- 对于捷克语用户，请注意 installshield 的语言选择面板在应该未翻译的安装中会提供一个经过翻译的条目。此局限性是由 installshield 导致的。该字符串是根据代码页从操作系统选取的。因为波兰语（已翻译该语种的安装）和捷克语都有代码页 1250，所以 Installshield 尝试从系统中检索这两种语言的语言列表，这导致此字符串出现在语言列表中。

- 如果使用繁体中文，则不要将输出从 Java 应用程序直接输送到多个命令中。而应将输出定向到一个临时文件中，然后单独查看该文件。

- 对于加泰罗尼亚语用户，应该使用 Lucida Console 字体以避免加重音符的大写字母变为乱码。它仅影响 Windows 2000 用户。

# 对本《用户指南》的意见？

如果对本《用户指南》的实用性或其他方面有任何意见，我们欢迎您通过以下方法提出宝贵意见。 请注意以下联系方式仅用于接收有关对文档的意见，并不回答技术咨询。请通过以下方法发送您的意见：

- 通过电子邮件发送到 idrcf@hursley.ibm.com。
- 通过传真：
  - 来自英国：01962 842327
  - 来自其他国家或地区：<国际代码>44 1962 842327
- 通过寄送普通邮件至以下地址：
  IBM United Kingdom Ltd
  User Technologies,
  Mail Point 095
  Hursley Park
  Winchester
  Hampshire
  SO21 2JN United Kingdom

说明。选择将消息发送给 IBM，就承认您的消息中包含的所有 信息（包括诸如问题、意见、建议或同样的信息等反馈数据）被认为是非机密的，IBM 对 诸如此类信息没有任何义务，可以没有限制地对这些信息进行免费再生产、使用、泄露和分发给其他人。而且，IBM 可以免费使用这些信息中包含的想法、概念、专有技术或技术，包括但不限于开发、生产和销售加入这些信息的产品。

# 声明

本信息是为在美国提供的产品和服务编写的。IBM 可能在其他国家或地区不提供本文档中讨论的产品、服务或功能特性。有关您当前所在区域的产品和服务的信息，请向您当地的 IBM 代表咨询。任何对 IBM 产品、程序或服务的引用并非意在明示或暗示只能使用 IBM 的产品、程序或服务。只要不侵犯 IBM 的知识产权，任何同等功能的产品、程序或服务，都可以代替 IBM 产品、程序或服务。但是，评估和验证任何非 IBM 产品、程序或服务，则由用户自行负责。

IBM 公司可能已拥有或正在申请与本文档内容有关的各项专利。提供本文档并未授予用户使用这些专利的任何许可证。您可以用书面方式将许可证查询寄往：

- IBM Director of Licensing
  IBM Corporation
  North Castle Drive, Armonk
  NY 10504-1758 U.S.A.

有关双字节（DBCS）信息的许可证查询，请与您所在国家或地区的 IBM 知识产权部门联系，或用书面方式将查询寄往：

- IBM World Trade Asia Corporation Licensing
  2-31 Roppongi 3-chome, Minato-ku
  Tokyo 106-0032, Japan

本条款不适用英国或任何这样的条款与当地法律不一致的国家或地区：

INTERNATIONAL BUSINESS MACHINES CORPORATION“按现状”提供本出版物，不附有任何种类的（无论是明示的还是暗含的）保证，包括但不限于暗含的有关非侵权、适销和适用于某特定用途的保证。某些国家或地区在某些交易中不允许免除明示或暗含的保证。因此本条款可能不适用于您。

本信息中可能包含技术方面不够准确的地方或印刷错误。此处的信息将定期更改；这些更改将编入本资料的新版本中。IBM 可以随时对本资料中描述的产品和／或程序进行改进和／或更改，而不另行通知。

本信息中对非 IBM Web 站点的任何引用都只是为了方便起见才提供的，不以任何方式充当对那些 Web 站点的保证。那些 Web 站点中的资料不是 IBM 产品资料的一部分，使用那些 Web 站点带来的风险将由您自行承担。

IBM 可以按它认为适当的任何方式使用或分发您所提供的任何信息而无须对您承担任何责任。

本程序的被许可方如果要了解有关程序的信息以达到如下目的：(i) 允许在独立创建的程序和其他程序（包括本程序）之间进行信息交换，以及 (ii) 允许对已经交换的信息进行相互使用，请与下列地址联系：

- JIMMAIL@uk.ibm.com
  [Hursley Java Technology Center (JTC) contact]

只要遵守适当的条件和条款，包括某些情形下的一定数量的付费，都可获得这方面的信息。

本资料中描述的许可程序及其所有可用的许可资料均由 IBM 依据 IBM 客户协议、IBM 国际程序许可证协议或任何同等协议中的条款提供。

此处包含的任何性能数据都是在受控环境中测得的。因此，在其他操作环境中获得的数据可能会有明显的不同。有些测量可能是在开发集的系统上进行的，因此不保证与一般可用系统上进行的测量结果相同。此外，有些测量是通过推算而估计的，实际结果可能会有差异。本文档的用户应当验证其特定环境的适用数据。

涉及非 IBM 产品的信息可从这些产品的供应商、其出版说明或其他可公开获得的资料中获取。IBM 没有对这些产品进行测试，也无法确认其性能的精确性、兼容性或任何其他关于非 IBM 产品的声明。有关非 IBM 产品性能的问题应当向这些产品的供应商提出。

## 商标

IBM 是 International Business Machines Corporation 在美国和／或其他国家或地区的商标。

Java 和所有基于 Java 的商标与徽标是 Sun Microsystems, Inc. 在美国和／或其他国家或地区的商标或注册商标。

Microsoft、Windows 和 Windows 徽标是 Microsoft Corporation 在美国和／或其他国家或地区的商标。

其他公司、产品或服务名称可能是其他公司的商标或服务标记。

本产品也是部分基于 FreeType Project 的工作成果的。关于 Freetype 的更多信息，请参阅 http://www.freetype.org。

本产品包括由 Apache Software Foundation http://www.apache.org/ 开发的软件。