IBM 64-bit SDK for Windows platforms, Java Technology Edition, V6

SDK 及运行时环境用户指南



(C) Copyright International Business Machines Corporation 2003, 2007. All rights reserved.

目录

前言
概述
版本兼容性
从其他 IBM JVM 进行迁移
SDK 和 Runtime Environment 的内容
Runtime Environment 类和工具
SDK 工具和参考信息
安装和配置 SDK 与 Runtime Environment
安装之前
安装程序包
照管(交互式)安装
安装 Runtime Environment 作为系统 Java 虚拟机
无人照看的安装
启用 IBM Accessibility Bridge
禁用 Java 辅助功能选项支持
适用于欧洲语言用户的信息
设置路径
设置类路径
运行 Java 应用程序
java 和 javaw 命令
获取版本信息
指定 Java 选项和系统属性
标准选项
java 命令的全球化
自动执行 Java 文件
Just-In-Time(JIT)编译器
禁用 JIT
启用 JIT
确定是否已启用 JIT
指定垃圾回收策略
垃圾回收选项
暂停时间
减少暂停时间
具有很满的堆的环境
欧元符号支持
使用印度语和泰语输入方法
使用 SDK 来开发 Java 应用程序
使用 XML
迁移到 XL-TXE-J
XML 参考信息
调试 Java 应用程序
Java 调试器(JDB)
确定您的应用程序是在 32 位还是 64 位 JVM 上运行
JVM 如何处理信号
JVM 所使用的信号
将本机代码驱动程序链接到信号链接库
编写 JNI 应用程序
配置大页面内存分配
CORBA 支持
用于跟踪 ORB 的系统属性
用于调整 ORB 的系统属性
ORB 的 Java 安全许可权
ORB 实现类
RMI over IIOP
实现 RMI 的连接处理程序池
增强的 BigDecimal
Applet 查看器
处理 applet
使用 Applet 查看器运行 applet
使用 Applet 查看器调试 applet
发布 Java 应用程序
JVM 之间的类数据共享
类数据共享概述
类数据共享的启用和配置
创建、植入、监视和删除高速缓存
性能和内存消耗
使用类数据共享的注意事项和局限性
高速缓存大小限制
运行时字节码修改
操作系统局限性
使用 SharedClassPermission
修改定制类装入器来共享类
使用 Java Communications API(JavaComm)
从压缩的文件安装 Java Communications API
在 javax.comm.properties 文件中指定设备
Java Communications API 的打印局限性
卸载 Java Communications API
Java Communications API 文档
为独立软件供应商提供的服务和支持
辅助功能选项
Swing 中 JComboBox 组件的键盘遍历
有关安全性的一般注释
是否对本用户指南持有任何意见?
附录 A. 非标准选项
附录 B. 已知局限性
声明
商标

前言

本用户指南提供有关 IBM(R) 64-bit SDK and Runtime Environment for Windows(R) on AMD64/EM64T architecture, Java(TM) Technology Edition, V6 的一般信息和 IBM 实现与 Sun 实现之间的所有差异的特定信息。

请阅读本用户指南,并结合使用以下 Sun Web 站点上的更多其他文档:http://java.sun.com

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

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

本用户指南是发行版的一部分并且只适用于该特定发行版。确保拥有的用户指南与正在使用的发行版相对应。

术语"Runtime Environment"和"Java 虚拟机"在整个用户指南中可以互换使用。

对于该版本的用户指南所作的技术更改(除了某些细微或明显的更改之外),在信息中心中进行查看时都以蓝色 V 形图案标出;在 HTML 中或彩色印刷的副本中进行查看时,以红色标出,并在更改的左侧标有竖线;作为 PDF 进行查看时,在更改的左侧标有竖线。

"程序代码"的设计不是为了在实时应用程序中使用的,包括(但不限于)飞机、航班流量、飞机导航或飞机通信的联机控制;或者任何核设施的设计、建筑、运行或维护。

概述

IBM SDK 是一种用于编写和运行符合 Java 6 Core Application Program Interface(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 64-bit SDK for Windows, V6 正确运行。但不保证使用此发行版编译的类可以在先前的发行版上工作。

有关发行版之间兼容性问题的信息,请参阅以下 Sun Web 站点:

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

如果将 SDK 用作其他产品(例如 IBM WebSphere(R) Application Server)的一部分,并且从先前级别的 SDK 进行升级(可能是 v5.0),那么序列化的类可能不会兼容。但是,类在不同服务更新之间是兼容的。

从其他 IBM JVM 进行迁移

从 V5.0 开始,IBM Runtime Environment for Windows 包含新版本的 IBM Virtual Machine for Java 和 Just-In-Time(JIT)编译器。

如果您正在从较 IBM Runtime Environment 进行迁移,请注意:

SDK 和 Runtime Environment 的内容

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

完全以 Java 编写的应用程序必须依赖于 IBM SDK 的目录结构(或那些目录中的文件)。任何对 SDK 目录结构(或那些目录中的文件)的依赖性都可能导致应用程序可移植性问题。

《用户指南》、Javadoc 以及随附的许可证、版权文件、javadoc 和演示目录是唯一包含在该 SDK for Windows 中的文档。从以下 Sun Web 站点,您可以查看 Sun 的软件文档或下载 Sun 的软件文档包:http://java.sun.com

Runtime Environment 类和工具

可以与标准 Runtime Environment 一起使用的类和工具的列表。

SDK 工具和参考信息

标准 SDK 所包含的工具列表和参考信息。

以下工具是 SDK 的一部分,位于 C:\Program Files\IBM\Java60\bin 目录中:
appletviewer.exe(Java Applet 查看器)
在 Web 浏览器外部测试并运行 applet。
apt.exe(注释和处理工具)
根据正在检验的指定源文件集合中存在的注释来查找和执行注释处理器。
extcheck.exe(Extcheck 实用程序)
检测目标 jar 文件和当前安装的扩展 jar 文件之间的版本冲突。
idlj.exe(IDL 到 Java 编译器)
从给定的 IDL 文件生成 Java 绑定。
ikeycmd.exe(iKeyman 命令行实用程序)
使您能够从命令行管理密钥、证书和证书请求。有关更多信息,请参阅随附的《安全指南》以及 http://www.ibm.com/developerworks/java/jdk/security
jar.exe(Java 归档工具)
将多个文件组合到一个 Java 归档(JAR)文件中。
jarsigner.exe(JAR 签署和验证工具)
生成 JAR 文件的签名,并验证已签署的 JAR 文件的签名。
java-rmi.exe(HTTP-to-CGI 请求转发工具)
接受"HTTP 上 RMI"请求,并将它们转发到正在侦听任意端口的某个 RMI 服务器。
javac.exe(Java 编译器)
将以 Java 编程语言编写的程序编译为字节代码(已编译的 Java 代码)。
javadoc.exe(Java 文档生成器)
从 Java 源文件生成 API 文档的 HTML 页面。
javah.exe(C 头文件和存根文件生成器)
使您能够将本机方法与以 Java 编程语言编写的代码关联。
javap.exe(类文件反汇编程序)
反汇编编译的文件,并可以打印字节代码的表示形式。
javaw.exe(Java 解释器)
以和 java 命令相同的方式运行 Java 类,但不使用控制台窗口。
jconsole.exe(JConsole 监视和管理工具)
使用 GUI 监视本地和远程 JVM。符合 JMX。
jdb.exe(Java 调试器)
帮助调试 Java 程序。
jdmpview.exe(跨平台转储格式化程序)
分析转储。请参阅 Diagnostics Guide 获取更多信息。
native2ascii.exe(本机至 ASCII 的转换器)
将本机编码文件转换为包含以 Latin-1 和/或 Unicode 编码的字符的 ASCII 文件。
rmic.exe(Java 远程方法调用(RMI)存根转换器)
生成远程对象的存根、框架和联系。包含"因特网 ORB 间协议上的 RMI"(RMI-IIOP)支持。
schemagen.exe
为 Java 类中所引用的每个名称空间创建模式文件。
serialver.exe(串行化版本命令)
以适合复制到进化的类中的格式返回一个或多个类的 serialVersionUID。
wsgen.exe
生成在 JAX-WS Web service 中使用的 JAX-WS 可移植工件。
wsimport.exe
根据 WSDL 文件生成 JAX-WS 可移植工件。
xjc.exe
编译 XML 模式文件。
包含文件
JNI 程序的 C 头部分。
演示
演示目录包含许多子目录,这些子目录包含您可以使用的样本源代码、演示、应用程序和 applet。自 V6 开始,RMI-IIOP 演示不包含在 SDK 中。
版权
SDK for Windows 软件的版权声明。
许可证

许可证文件(C:\Program Files\IBM\Java60\docs\content\<locale>\LA_<locale>)包含 SDK for Windows 软件的许可证协议(其中 <locale> 是语言环境的名称,例如 en)。要查看或打印许可协议,请在 Web 浏览器中打开此文件。

安装和配置 SDK 与 Runtime Environment

使用安装向导或压缩的文件安装 SDK。使用环境变量、命令行选项和属性文件配置 SDK。

安装之前

要安装 SDK 或 Runtime Environment 程序包,请下载相关的安装程序包。确保将所有程序包下载到同一个目录中,并且临时目录中具有足够的空间。

这些程序包和它们的文件名列出在安装程序包中;请勿更改程序包的文件名。

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

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

安装程序包

许多程序包可独立安装,其中包含 SDK、Runtime Environment、Javacomm、文档以及演示。

您可以安装的程序包有:

其他程序包作为压缩文件提供:

如果从压缩程序包安装 SDK 或 Runtime Enviroment,将不能使用 Web Start 或 Java 插件,并且控制面板将包含一个不能使用的更新选项卡。

照管(交互式)安装

使用照管安装在单个客户端上安装 SDK 或 JRE。

  1. 启动 ibm-java-sdk-60-win-x86_64.exe(针对 SDK)或 ibm-java-jre-60-win-x86_64.exe(仅针对 Runtime Environment)。
  2. 按照安装向导中的指示信息执行操作。

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

    如果已下载了 SDK 可安装程序包,您可以选择安装哪些组件:

    在安装向导中,将对您提供以下选项:

    在 Windows Vista 上,选择安装语言之后,可能存在延迟。

    如果安装失败并且出现错误消息"应用变换时出错",那么 Windows 安装程序的配置信息已被毁坏。要修正该错误,请使用 Windows安装程序清除实用程序(可从 http://support.microsoft.com/kb/290301 下载)除去已毁坏的 Windows 安装程序配置信息。

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

当安装 Runtime Environment(作为 SDK 可安装程序包的一部分或从 Runtime Environment 可安装程序包进行安装)时,会询问您是否要安装 Runtime Environment 作为系统 Java 虚拟机(JVM)。如果将其安装为系统 JVM,那么安装程序会将 java.exe、javacpl.cpl、javaws.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)。

无人照看的安装

使用无人照看安装在多个客户端上安装 SDK 或 JRE。

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

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

ibm-java-sdk-60-win-x86_64 /r

ibm-java-jre-60-win-x86_64 /r

根据您的 Windows 产品,响应文件(setup.iss)将在 C:\Windows 或 C:\Winnt 目录中创建。

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

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

如果显示此消息,请单击,退出安装。转至 Windows 系统目录并删除以下两个文件:

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

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

ibm-java-sdk-60-win-x86_64 /s /f1c:\Windows\setup.iss /f2c:\setup.log
ibm-java-jre-60-win-x86_64 /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,请删除 Accessibility.properties 文件中 assistive_technologies 条目的注释。

文件 Accessibility.properties 位于 jre/lib 目录中。删除下行开头处的"#"。

#assistive_technologies=JawBridge

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

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

禁用 Java 辅助功能选项支持

您可以禁用 Java 辅助功能选项支持来提高不提供 Java 辅助技术支持的 Java 应用程序的 JVM 装入性能(尤其是通过网络链接装入时)。要禁用 Java 辅助功能选项支持,请将 JAVA_ASSISTIVE 环境变量设置为 OFF。

如果此环境变量设置为 OFF,那么即使在 Accessibility.properties 文件中启用了该技术,辅助技术(如 JawBridge)也是不可用的。

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

在 Windows 中,一个进程有两种代码页:ANSI(或 Windows)代码页和 OEM(或 DOS)代码页。javaw 命令始终使用 ANSI 代码页,除非设置了 console.encoding 系统属性。

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

设置路径

如果更改了 PATH 环境变量,将覆盖路径中所有已存在的 Java 启动程序。

PATH 环境变量使 Windows 能够从当前目录中查找程序和实用程序,例如 javac、java 和 javadoc。要显示 PATH 的当前值,请在命令提示符中输入以下命令:

echo %PATH%

要将 Java 启动程序添加到您的路径中:

  1. 如果已经在 C:\Program Files\IBM\Java60\ 中安装了 SDK 或 Runtime Environment,请将以下目录添加到 PATH 环境变量中:
  2. 关闭并重新打开任何命令提示符窗口以激活新的 PATH 环境变量。

设置路径之后,您可以从任何目录中的命令提示符处输入名称来运行工具。例如,要编译文件 Myfile.Java,在命令提示符处输入:

javac Myfile.Java

设置类路径

类路径告诉 SDK 工具(例如 java、javac 和 javadoc)哪里可以找到 Java 类库。

只有出现以下情况时,您才需要显式地设置类路径:

要显示 CLASSPATH 环境变量的当前值,请在命令提示符处输入以下命令:

  echo %CLASSPATH%

如果开发并运行使用不同运行时环境的应用程序,包括已经单独安装的其他版本,那么必须为每个应用程序显式地设置 CLASSPATHPATH。如果您同时运行多个应用程序并使用不同运行时环境,那么每个应用程序都必须在它自己的命令提示符中运行。

运行 Java 应用程序

Java 应用程序可以使用 java 启动程序或通过 JNI 来启动。使用命令行参数、环境变量以及属性文件,可将设置传递给 Java 应用程序。

java 和 javaw 命令

java 和 javaw 命令的简短概述。

用途

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

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

用法

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

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

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

参数

[options]
要传递到运行时环境的命令行选项。
<class>
启动类。类必须包含 main() 方法。
<file.jar>
要调用的 jar 文件的名称。仅与 -jar 选项一起使用。指定的 JAR 文件必须包含应用程序的类和资源文件,启动类则由主类清单头指示。
[arguments ...]
要传递到启动类的 main() 函数的命令行参数。

获取版本信息

使用 -version 选项可获取 Java 安装的 IBM 构建号和版本号。也可以使用 -Xjarversion 选项获取类路径中所有 jar 文件的版本信息。

  1. 打开命令提示符。
  2. 输入以下命令:
    java -version
    您看到的信息将类似于:
    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 Windows Vista amd64-64 jvmwa6460-20070326_12091 (JIT enabled)
    J9VM - 20070326_12091_LEdSMr
    JIT  - dev_20070326_1800
    GC   - 20070319_AA)
    精确的构建日期和版本将更改。

输入以下命令可列出类路径、引导类路径和扩展目录中所有可用 jar 文件的版本信息:

java -Xjarversion

您看到的信息将类似于:

...
C:\Program Files\IBM\Java60\jre\lib\ext\ibmpkcs11impl.jar  VERSION: 1.0 build_20070125
C:\Program Files\IBM\Java60\jre\lib\ext\dtfjview.jar
C:\Program Files\IBM\Java60\jre\lib\ext\xmlencfw.jar  VERSION: 1.00, 20061011  LEVEL: -20061011

...

每个 jar 文件可用的信息不尽相同,并且信息可以从 jar 文件清单的 Implementation-Version 和 Build-Level 属性获取。

指定 Java 选项和系统属性

您可以通过使用选项文件或环境变量,在命令行中指定 Java 选项和系统属性。

以下指定 Java 选项的方法按优先顺序列出:

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

命令行上最右的选项优先于最左的选项;例如,如果指定:

java -Xint -Xjit myClass

那么 -Xjit 选项优先。

标准选项

标准选项的定义。

-agentlib:<libname>[=<options>]
装入本机代理程序库 <libname>;例如,-agentlib:hprof。有关更多信息,请在命令行中指定 -agentlib:jdwp=help-agentlib:hprof=help
-agentpath:libname[=<options>]
按完整路径名装入本机代理程序库。
-cp <directories and zip or jar files separated by ;>
设置应用程序类和资源的搜索路径。如果不使用 -classpath -cp ,也不使用和设置 CLASSPATH,那么缺省情况下,用户的类路径是当前目录(.)。
-classpath <directories and zip or jar files separated by ;>
设置应用程序类和资源的搜索路径。如果不使用 -classpath -cp ,也不使用和设置 CLASSPATH,那么缺省情况下,用户的类路径是当前目录(.)。
-D<property name>=<value>
设置系统属性。
-help 或 -?
打印使用消息。
-javaagent:<jarpath>[=<options>]
装入 Java 编程语言代理程序。有关更多信息,请参阅 java.lang.instrument API 文档。
-jre-restrict-search
在版本搜索中包含用户专用的 JRE。
-no-jre-restrict-search
在版本搜索中排除用户专用的 JRE。
-showversion
打印产品版本并继续。
-verbose:<option>
启用详细输出。可用的选项有:
class
为每个装入的类对 stderr 写入一个条目。
gc
向 stderr 写入详细垃圾回收信息。使用 -Xverbosegclog 来控制输出。请参阅 Diagnostics Guide 获取更多信息。
jni
向 stderr 写入描述由应用程序和 JVM 调用的 JNI 服务的信息。
sizes
向 stderr 写入描述活动内存用途设置的信息。
stack
向 stderr 写入描述每个线程的 Java 和 C 堆栈用途的信息。
-version
打印产品版本。
-version:<value>
需要运行指定的版本,例如『1.5』。
-X
打印关于非标准选项的帮助。

java 命令的全球化

java 和 javaw 启动程序接受包含当前语言环境字符集中的任何字符的参数和类名。您还可以通过使用 Java 转义序列来在类名和参数中指定任何 Unicode 字符。

要执行此操作,请使用 -Xargencoding 命令行选项。

-Xargencoding
使用参数编码。要指定 Unicode 字符,请以 \u#### 格式使用转义序列,其中 # 是十六进制数字(0-9,A-F)。
-Xargencoding:utf8
使用 UTF8 编码。
-Xargencoding:latin
使用 ISO8859_1 编码。

例如,要指定名为"HelloWorld"的对两个大写字母使用 Unicode 编码的类,请使用以下命令:

java -Xargencoding '\u0048ello\u0057orld'

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

自动执行 Java 文件

要设置 Java 类或 jar 文件以从 Windows 资源管理器中自动启动,请使用 Windows 资源管理器的工具 -> 文件夹选项 -> 文件类型选项。

或者,可以在命令提示符下输入:

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

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

Just-In-Time(JIT)编译器

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

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

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

禁用 JIT

可以用几种方式禁用 JIT。这两个命令行选项都将覆盖 JAVA_COMPILER 环境变量。

关闭 JIT 是临时性措施,这有助于在调试 Java 应用程序时隔离问题。

启用 JIT

缺省情况下,JIT 是启用的。您可以使用多种不同的方法来显式地启用 JIT。这两个命令行选项都将覆盖 JAVA_COMPILER 环境变量。

确定是否已启用 JIT

您可以使用 -version 选项确定 JIT 的状态。

-version 选项运行 java 启动程序。在命令提示符中输入以下命令:

java -version

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

(JIT 已禁用)

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

(JIT 已启用)

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

指定垃圾回收策略

垃圾收集器管理 Java 以及 JVM 中运行的应用程序所使用的内存。

当垃圾收集器收到存储请求时,堆中未使用的内存将被置入名为"分配"的过程中。垃圾收集器还检查那些不再被引用的内存区域,请释放这些区域以供复用。这被称为:收集"。

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

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

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

垃圾回收选项

-Xgcpolicy 选项控制垃圾收集器的行为。它们在应用程序和整个系统的吞吐量与由于垃圾收集引起的暂停时间之间进行权衡。

选项的格式及其值是:

-Xgcpolicy:optthruput
(缺省值和建议值。)它向应用程序传递非常高的吞吐量,但代价是偶尔出现暂停。
-Xgcpolicy:optavgpause
缩减在垃圾回收暂停中耗费的时间,并限制增长的堆大小对垃圾回收暂停时间长度的影响。如果您的配置有非常大的堆,请使用 optavgpause
-Xgcpolicy:gencon
请求组合使用并发和分代 GC 来帮助使在任何垃圾回收暂停中耗费的时间最小化。

暂停时间

当堆中的可用空间无法立即满足应用程序创建对象的尝试时,垃圾收集器就负责标识未引用的对象(垃圾)、删除它们并使堆返回到可以快速满足立即和后继分配请求的状态。

这样的垃圾收集循环在应用程序代码执行中引起了偶发的意外暂停。因为应用程序的大小和复杂程度不断增长,堆也相应不断扩大,此垃圾收集暂停时间长度和影响方面一般也会有所增加。

缺省的垃圾回收值 -Xgcpolicy:optthruput 向应用程序传递非常高的吞吐量,但要以这些偶发的暂停为代价,这些暂停可能从几毫秒到许多秒不等,取决于堆的大小和无用数据的数量。

减少暂停时间

JVM 使用两种技术来缩减暂停时间:并发垃圾回收和分代垃圾回收。

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

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

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

具有很满的堆的环境

如果 Java 堆快满了,并且几乎没有可回收的垃圾,请求新对象可能不会被很快地满足,因为没有立即可用的空间了。

如果在容量接近于满时操作堆,无论使用哪个垃圾回收选项,应用程序性能都可能会受损;另外,如果继续请求更多的堆空间,那么应用程序可能会接收到 OutOfMemoryError,如果未捕获并处理异常的话,这将导致 JVM 终止。此时,JVM 生成一个 Javadump 文件以供在诊断期间使用。在这些情况下,建议您使用 -Xmx 选项来增加堆大小或减少使用的对象数。

请参阅 Diagnostics Guide 获取更多信息。

欧元符号支持

IBM SDK 和 Runtime Environment 设置欧元从 2202 年 1 月 1 日开始作为欧洲货币联盟(EMU)中那些国家或地区的缺省货币。自 2008 年 1 月 1 日起,塞浦路斯和马耳他也将欧元作为缺省货币。

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

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

使用印度语和泰语输入方法

从 V6 开始,将不缺省提供印度语和泰语输入方法。您必须手工在 Java 扩展路径中包含输入方法 jar 文件来使用印度语和泰语输入方法。

在 V5.0 中,输入方法 jar 文件包含在 jre\lib\ext 目录中并将由 JVM 自动装入。在 V6 中,输入方法 jar 文件包含在 jre\lib\im 目录中,并且必须手工添加到 Java 扩展路径来启用印度语和泰语输入方法。要做到这一点,请使用以下方法之一:

如果将 SDK 或 Runtime Environment 安装在不同的目录,请用安装 SDK 或 Runtime Environment 的目录来替换 C:\Program Files\IBM\Java60\。

使用 SDK 来开发 Java 应用程序

SDK for Windows 包含很多 Java 软件开发所需的工具和库。

请参阅 SDK 工具和参考信息获取可用工具的详细信息。

使用 XML

IBM SDK 包含 XML4J 和 XL XP-J 解析器、XL TXE-J 1.0 XSLT 编译器和 XSLT4J XSLT 解释器。这些工具使您能够独立于任何给定的 XML 处理实现对 XML 文档进行解析、验证、转化以及序列化。

使用 factory 查找程序定位抽象 factory 类的实现,如选择 XML 处理器中所述。使用 factory 查找程序,您可以选择其他 XML 库而无需更改 Java 代码。

可用的 XML 库

IBM SDK for Java 包含以下 XML 库。

XML4J 4.5

XML4J 是一个验证解析器,提供对以下标准的支持:

XML4J 4.5 基于 Apache Xerces-J 2.9.0.有关更多信息,请参阅 http://xerces.apache.org/xerces2-j/

XL XP-J 1.1

XL XP-J 1.1 是一个高性能的非验证解析器,提供对 StAX 1.0(JSR 173)的支持;是对 XML 1.0 和 XML 1.1 文档的拉式解析和流式串行化的双向 API。请参阅 XL XP-J 参考信息部分,以了解 XL XP-J 1.1 支持的功能的更多详细信息。

XL TXE-J 1.0.1 Beta

对于 V5.0,IBM SDK for Java 包含 XSLT4J 编译器和解释器。缺省使用 XSLT4J 解释器。

对于 V6,IBM SDK for Java 包含 XL TXE-J。XL TXE-J 包含 XSLT4J 2.7.8 解释器和新的 XSLT 编译器。缺省使用新的编译器。IBM SDK for Java 不再包含 XSLT4J 编译器,有关迁移到 XL TXE-J 的信息,请参阅迁移到 XL-TXE-J

XL TXE-J 提供对以下标准的支持:

选择 XML 处理器

XML 处理器选择是通过使用服务提供者来执行的。当使用 factory 查找程序时,Java 将在以下位置查找以确定使用哪个服务提供者:

  1. 具有与服务提供者相同名称的系统属性。
  2. 仅用于 XMLEventFactory、XMLInputFactory 和 XMLOutputFactory。文件 C:\Program Files\IBM\Java60\jre\lib\stax.properties 中服务提供者的值。
  3. 对于其他 factory。文件 C:\Program Files\IBM\Java60\jre\lib\jaxp.properties 中服务提供者的值。
  4. META-INF\services\<service.provider> 文件的内容。
  5. 缺省服务提供者。

以下服务提供者控制 Java 使用的 XML 处理库:

javax.xml.parsers.SAXParserFactory
选择 SAX 解析器。缺省情况下,使用 XML4J 库的 org.apache.xerces.jaxp.SAXParserFactoryImpl。
javax.xml.parsers.DocumentBuilderFactory
选择文档构建器。缺省情况下,使用 XML4J 库的 org.apache.xerces.jaxp.DocumentBuilderFactoryImpl。
javax.xml.datatype.DatatypeFactory
选择数据类型 factory。缺省情况下,使用 XML4J 库中的 org.apache.xerces.jaxp.datatype.DatatypeFactoryImpl。
javax.xml.stream.XMLEventFactory
选择 StAX 事件 factory。缺省情况下,使用 XL XP-J 库中的 com.ibm.xml.xlxp.api.stax.XMLEventFactoryImpl。
javax.xml.stream.XMLInputFactory
选择 StAX 解析器。缺省情况下,使用 XL XP-J 库中的 com.ibm.xml.xlxp.api.stax.XMLInputFactoryImpl。
javax.xml.stream.XMLOutputFactory
选择 StAX 串行器。缺省情况下,使用 XL XP-J 库中的 com.ibm.xml.xlxp.api.stax.XMLOutputFactoryImpl。
javax.xml.transform.TransformerFactory
选择 XSLT 处理器。可能的值有:
com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl
使用 XL TXE-J 编译器。这是缺省值。
org.apache.xalan.processor.TransformerFactoryImpl
使用 XSLT4J 解释器。
javax.xml.validation.SchemaFactory:http://www.w3.org/2001/XMLSchema
选择 W3C XML 模式语言的模式 factory。缺省情况下,使用 XML4J 库中的 org.apache.xerces.jaxp.validation.XMLSchemaFactory。
javax.xml.xpath.XPathFactory
选择 XPath 处理器。缺省情况下,使用 XSLT4J 库的 org.apache.xpath.jaxp.XPathFactoryImpl。

迁移到 XL-TXE-J

XL TXE-J 编译器已经代替 XSLT4J 解释器作为缺省 XSLT 处理器。遵循以下步骤,为新库准备应用程序。

当多次应用相同的变换时,XL TXE-J 编译器比 XSLT4J 解释器快。 如果各个变换只执行一次,由于编译和优化的开销,XL TXE-J 编译器比 XSLT4J 解释器慢。

要继续使用 XSLT4J 解释器作为 XSLT 处理器,将 javax.xml.transform.TransformerFactory 服务提供者设置为 org.apache.xalan.processor.TransformerFactoryImpl。

要迁移到 XL-TXE-J 编译器,请遵循以下步骤:

  1. 设置 javax.xml.transform.TransformerFactory 服务提供者时使用 com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl。
  2. 重新生成由 XSLT4J 编译器生成的类文件。XL TXE-J 无法执行由 XSLT4J 编译器生成的类文件。
  3. 编译器生成的某些方法可能超过 JVM 方法的大小限制,在这种情况下,编译器将尝试把这些方法拆分成较小的方法。 要设置拆分限制,请在使用 Process 或 Compile 命令时,使用 -SPLITLIMIT 选项,或者在使用变换器工厂时,使用 http://www.ibm.com/xmlns/prod/xltxe-j/split-limit 变换器工厂属性。拆分限制可以在 100 和 2000 之间。当以手工方式设置拆分限制时,请使用尽可能高的拆分限制来获得最佳性能。
  4. XL TXE-J 可能需要比 XSLT4J 编译器更多的内存。如果内存耗尽或者性能似乎很差,请使用 -Xmx 选项增加堆的大小。
  5. 请迁移应用程序以使用新的属性键。不推荐使用旧的变换器工厂属性键。旧的名称将被接收,但将显示警告。
    表 1. 从 XSL4J 编译器到 XL TXE-J 编译器的属性键的更改
    XSL4J 编译器属性 XL TXE-J 编译器属性
    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 在新编译器中已废弃
  6. 可选: 要达到最佳性能,请确保不重新编译可复用的 XSLT 变换。 使用以下一种方法可复用已编译的变换:

XML 参考信息

XL XP-J 和 XL TXE-J XML 库对于 SDK V6 是最新的。该参考信息描述了这些库支持的功能。

XL XP-J 参考信息

XL XP-J 1.1 是一个高性能的非验证解析器,提供对 StAX 1.0(JSR 173)的支持;是对 XML 1.0 和 XML 1.1 文档的拉式解析和流式串行化的双向 API。

不支持的功能

XL XP-J 不支持以下可选的 StAX 功能:

XMLInputFactory 引用

以下属性受 javax.xml.stream.XMLInputFactory 实现支持,如 XMLInputFactory Javadoc 中所述。

表 2.
属性名 支持
javax.xml.stream.isValidating 否。XL XP-J 扫描程序不支持验证。
javax.xml.stream.isNamespaceAware 是(支持 true 和 false)。对于根据 DOMSource 创建的 XMLStreamReader,名称空间处理取决于创建 DOM 树的方法,该值无作用。
javax.xml.stream.isCoalescing
javax.xml.stream.isReplacingEntityReferences 是。对于根据 DOMSource 创建的 XMLStreamReader,如果实体已经在 DOM 树中被替换,对该参数的设置将无效。
javax.xml.stream.isSupportingExternalEntities
javax.xml.stream.supportDTD 否。始终支持 DTD。将该值设置为 false 无效。
javax.xml.stream.reporter
javax.xml.stream.resolver

XL XP-J 也支持可选方法 createXMLStreamReader(javax.xml.transform.Source), 该方法允许根据 DOM and SAX 数据源创建 StAX 阅读器。

XMLStreamReader 引用

以下属性受 javax.xml.stream.XMLStreamReader 实现支持,如 XMLStreamReader Javadoc 中所述。

表 3.
属性名 支持
javax.xml.stream.entities
javax.xml.stream.notations

XL XP-J 还支持 javax.xml.stream.isInterning 属性,该属性返回一个布尔值,指示 API 调用返回的 XML 名称和名称空间 URI 是否已被解析器保留。

XMLOutputFactory 引用

以下属性受 javax.xml.stream.XMLOutputFactory 实现支持,如 XMLOutputFactory Javadoc 中所述。

表 4.
属性名 支持
javax.xml.stream.isRepairingNamespaces

XMLStreamWriter 引用

以下属性受 javax.xml.stream.XMLStreamWriter 实现支持,如 XMLStreamWriter Javadoc 中所述。

表 5.
属性名 支持
javax.xml.stream.isRepairingNamespaces

XMLStreamWriter 对象的属性是只读的。

XL TXE-J 参考信息

XL TXE-J 是包含 XSLT4J 2.7.8 解释器和 XSLT 编译器的 XSLT 库。

功能部件对照表

表 6. XSLT4J 解释器、XSLT4J 编译器和 XL TXE-J 编译器中的功能部件对照
功能部件 XSLT4J 解释器(包含) XSLT4J 编译器(不包含) XL TXE-J 编译器(包含)
http://javax.xml.transform.stream.StreamSource/feature 功能部件
http://javax.xml.transform.stream.StreamResult/feature 功能部件
http://javax.xml.transform.dom.DOMSource/feature 功能部件
http://javax.xml.transform.dom.DOMResult/feature 功能部件
http://javax.xml.transform.sax.SAXSource/feature 功能部件
http://javax.xml.transform.sax.SAXResult/feature 功能部件
http://javax.xml.transform.stax.StAXSource/feature 功能部件
http://javax.xml.transform.stax.StAXResult/feature 功能部件
http://javax.xml.transform.sax.SAXTransformerFactory /feature 功能部件
http://javax.xml.transform.sax.SAXTransformerFactory /feature/xmlfilter 功能部件
http://javax.xml.XMLConstants/feature/secure-processing 功能部件
http://xml.apache.org/xalan/features/incremental 属性
http://xml.apache.org/xalan/features/optimize 属性
http://xml.apache.org/xalan/properties/source-location 属性
translet-name 属性 不适用 是(使用新名称)
destination-directory 属性 不适用 是(使用新名称)
package-name 属性 不适用 是(使用新名称)
jar-name 属性 不适用 是(使用新名称)
generate-translet 属性 不适用 是(使用新名称)
auto-translet 属性 不适用 是(使用新名称)
use-classpath 属性 不适用 是(使用新名称)
enable-inlining 属性 否(在 TL TXE-J 中废弃)
indent-number 属性 是(使用新名称)
debug 属性 是(使用新名称)
Java 扩展 是(仅简略语法,不支持 xalan:component/xalan:script 构造)
JavaScript 扩展
扩展元素
EXSLT 扩展函数 是(排除动态) 是(排除动态)
redirect 扩展 是(排除 redirect:open 和 redirect:close)
output 扩展
nodeset 扩展
NodeInfo 扩展函数
SQL 库扩展
pipeDocument 扩展
evaluate 扩展
tokenize 扩展
XML 1.1

使用 Process 命令时,对于使用 StAX 流处理的变换,请使用 -FLAVOR sr2sw,对于 StAX 事件处理,请使用 -FLAVOR er2ew

新编译器不查找 org.apache.xalan.xsltc.dom.XSLTCDTMManager 服务提供者。相反,如果使用 StreamSource,将切换到高性能的 XML 解析器。

Inlining 在 XL TXE-J 中已废弃。

org.apache.xalan.xsltc.trax.SmartTransformerFactoryImpl 类不再受支持。

使用较早版本的 Xerces 或 Xalan

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

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

调试 Java 应用程序

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

可在 Diagnostics Guide 找到更多有关 Java 的问题诊断的信息。

Java 调试器(JDB)

Java 调试器(JDB)包含在 SDK for Windows 中。该调试器由 jdb 命令调用;它使用 JPDA 连接到 JVM。

要调试 Java 应用程序:

  1. 使用以下选项启动 JVM:
    java -Xdebug -Xrunjdwp:transport=dt_shmem,server=y,address=<port> <class>
    JVM 启动,但在它启动 Java 应用程序之前将暂缓执行。
  2. 您可以在单独的会话中将调试器连接到 JVM:
    jdb -attach <port>
    调试器将连接到 JVM,您现在可以发出一系列命令来检查和控制 Java 应用程序;例如,输入 run 使 Java 应用程序可以启动。

有关 JDB 选项的更多信息,请输入:

jdb -help

有关 JDB 命令的更多信息:

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

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

  1. 使用以下选项启动 JVM:
    java -Xdebug -Xrunjdwp:transport=dt_shmem,server=y,address=<port> <class>
    JVM 启动,但在它启动 Java 应用程序之前将暂缓执行。
  2. 将调试器连接到远程 JVM:
    jdb -connect com.sun.jdi.SocketAttach:hostname=<host>,port=<port>

Java 虚拟机调试接口(JVMDI)在此发行版中不受支持。已将它替换为 Java 虚拟机工具接口(JVMTI)。

有关 JDB 和 JPDA 及其用法的更多信息,请参阅以下 Web 站点:

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

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

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

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

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

JVM 如何处理信号

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

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

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

当信号在外部(例如当输入 CTRL-BREAK)生成的情况下,将为信号处理程序创建新的线程。在这种情况下,JVM 信号处理程序执行它的处理;如果安装了此信号的应用程序处理程序,但没有指定 -Xnosigchain 命令行选项,就会调用此信号的应用程序处理程序。

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

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

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

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

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

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

JVM 所使用的信号

信号的类型为中断和控制。

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

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

表 7. JVM 所使用的信号
信号名称 信号类型 描述 是否被 -Xrs 禁用
SIGINT (2) 中断 交互式注意信号(CTRL-C)。JVM 正常退出。
SIGTERM (15) 中断 终止请求。JVM 将正常退出。
SIGBREAK 控制 从终端发出的断开信号。缺省情况下,这将触发 Javadump。

IBM JVM 使用 AddVectoredExceptionHandler() 和 SetConsoleCtrlHandler() API。它们是使用 -Xrs 禁用的。-Xnosigchain 在 Windows 被忽略。

使用 -Xrs(减少信号使用)选项来防止 JVM 处理大多数的信号。要获取更多信息,请参阅 Sun 的 Java 应用启动程序页面

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

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

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

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

libjsig.dll 库还对应用程序隐藏 JVM 信号处理程序。因此,JVM 启动后所进行的调用(如 signal()、sigset() 和 sigaction())不再返回对 JVM 的信号处理程序的引用,但是取而代之的是返回任何 JVM 启动前所安装的处理程序。

环境变量 JAVA_HOME 应设置为 SDK 的位置,例如 C:\Program Files\IBM\Java60\。

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

编写 JNI 应用程序

本机程序可在 JNI_CreateJavaVM() API 调用上指定的有效版本号是:JNI_VERSION_1_2(0x00010002) 和 JNI_VERSION_1_4(0x00010004)。

限制: 版本 1.1 的 Java Java 本机接口(JNI)不受支持。

此版本号仅确定要使用的 JNI 本机接口的等级。创建的 JVM 的实际等级由 JSE 库(即 v6)指定。JNI 接口 API 影响 JVM 实现的语言规范、类库 API 或 JVM 行为的任何其他领域。有关更多信息,请参阅 http://java.sun.com/javase/6/docs/technotes/guides/jni/

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

配置大页面内存分配

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

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

要让 JVM 使用大页面,系统必须有足够数量的连续大页面可用。如果无法分配大页面(甚至当有足够页面可用时),那么可能大页面不是连续的。

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

CORBA 支持

Java Platform, Standard Edition(JSE)至少支持 Sun 的一致性文档中定义的规范。在有些情况下,IBM JSE ORB 还支持更新版本的规范。

支持的最低规范是在 Java SE 6 中 CORBA 支持的官方规范

对 GIOP 1.2 的支持

根据 OMG 文档 formal/99-10-07 的 CORBA 2.3.1 规范第 13 章和第 15 章所定义,此 SDK 支持所有版本的 GIOP。

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 向"可互操作命名服务"注册服务。但是,在 V6 的 Sun Java Core API 中未提供此方法。需要在当前版本中注册服务的程序必须在 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
打开 ORB 跟踪
com.ibm.CORBA.CommTrace=true
将(发送和接收到的)GIOP 消息添加到跟踪。
com.ibm.CORBA.Debug.Output=<file>
指定跟踪输出文件。缺省情况下,它的格式是 orbtrc.DDMMYYYY.HHmm.SS.txt。

ORB 跟踪示例

例如,要从命令行跟踪事件和格式化的 GIOP 消息,请输入:

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

局限性

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

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

用于调整 ORB 的系统属性

可以调整 ORB 以在特定网络上良好运行。下文描述了调整 ORB 所需的属性。

com.ibm.CORBA.FragmentSize=<size in bytes>
用来控制 GIOP 1.2 分段。缺省大小是 1024 字节。

要禁用分段,将片段大小设置为 0 字节:

java -Dcom.ibm.CORBA.FragmentSize=0 <myapp>
com.ibm.CORBA.RequestTimeout=<time in seconds>
设置等待 CORBA 请求的最大时间长度。缺省情况下,ORB 将等待无限长时间。请勿将超时设置得太低,否则连接可能会不必要地结束。
com.ibm.CORBA.LocateRequestTimeout=<time in seconds>
设置等待 CORBA LocateRequest 的最大时间长度。缺省情况下,ORB 将等待无限长时间。
com.ibm.CORBA.ListenerPort=<port number>
设置 ORB 用来读取入局请求的端口。如果设置了此属性,ORB 在初始化后,就会立即开始侦听。否则,只在要求时,它才开始侦听。

ORB 的 Java 安全许可权

与 Java SecurityManager 一起运行时,调用 CORBA API 类中的某些方法可能导致进行许可权检查,这可能产生 SecurityException。如果程序使用这些方法中的任何一个,请确保它被授予必要的许可权。

表 8. 与 Java SecurityManager 一起运行时受影响的方法
类/接口 方法 需要的许可权
org.omg.CORBA.ORB init java.net.SocketPermission 解析
org.omg.CORBA.ORB connect java.net.SocketPermission 侦听
org.omg.CORBA.ORB resolve_initial_references java.net.SocketPermission 连接
org.omg.CORBA. portable.ObjectImpl _is_a java.net.SocketPermission 连接
org.omg.CORBA. portable.ObjectImpl _non_existent java.net.SocketPermission 连接
org.omg.CORBA. portable.ObjectImpl OutputStream _request(字符串、布尔值) java.net.SocketPermission 连接
org.omg.CORBA. portable.ObjectImpl _get_interface_def java.net.SocketPermission 连接
org.omg.CORBA. Request invoke java.net.SocketPermission 连接
org.omg.CORBA. Request send_deferred java.net.SocketPermission 连接
org.omg.CORBA. Request send_oneway java.net.SocketPermission 连接
javax.rmi. PortableRemoteObject narrow java.net.SocketPermission 连接

ORB 实现类

ORB 实现类的列表。

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

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

RMI over IIOP

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

可获取以下文档:

实现 RMI 的连接处理程序池

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

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

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

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

增强的 BigDecimal

从 Java 5.0 开始,IBM BigDecimal 类已被 Sun 作为 java.math.BigDecimal 采用。保留了 com.ibm.math.BigDecimal 类,以便将来供 IBM 使用,目前它是不推荐的类。迁移现有的 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.*;

Applet 查看器

Java 插件用于在浏览器中运行 Java 应用程序。appletviewer 用于测试设计为在浏览器中运行的应用程序。Java Web Start 用于在网络中部署 Java 应用程序,并提供更新机制。

处理 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 查看器,请在命令提示符中输入:

appletviewer <demo>\GraphLayout\example1.html

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

要在 Web 页面上调用 Applet 查看器,请在命令提示符中输入:

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

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

appletviewer -encoding JISAutoDetect sample.html

使用 Applet 查看器调试 applet

您可以使用 Applet 查看器的 -debug 选项调试 applet。

例如:

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

您可以在以下 Sun Web 站点找到关于如何使用 Applet 查看器调试 applet 的文档:http://java.sun.com/javase/6/docs/technotes/guides/plugin/developer_guide/debugger.html

发布 Java 应用程序

Java 应用程序通常包含类、资源和数据文件。

当发布 Java 应用程序时,软件包可能包含以下几部分:

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

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

JVM 之间的类数据共享

类数据共享使多个 JVM 能够共享内存中的一个空间。

Java 虚拟机(JVM)使您能够通过将数据存储在磁盘上内存映射的高速缓存文件中,在 JVM 之间共享类数据。当多个 JVM 共享一个高速缓存时,共享可降低整体的虚拟内存耗用。当创建高速缓存后,共享还可降低 JVM 的启动时间。共享类高速缓存独立于任何处于活动状态的 JVM,并且持续存在直至它受到破坏。

共享的高速缓存可以包含:

类数据共享概述

类数据共享提供了一种用于减少内存占用和缩短 JVM 启动时间的透明方法。Java 6 在高速缓存管理、隔离和性能方面提供了新的和改进的功能。

启用类数据共享

通过在启动 JVM 时使用 -Xshareclasses 选项来启用类数据共享。JVM 将连接到现有高速缓存,或者如果高速缓存不存在,新创建一个。

缺省情况下,JVM 装入的所有引导程序和应用程序类都被共享。如果定制类装入器扩展应用程序类装入器,那么会自动共享类;否则,它们必须使用随 JVM 提供的 Java Helper API 来访问高速缓存。(请参阅修改定制类装入器来共享类。)

JVM 也可以存储某些方法的 AOT(Ahead-of-time)编译代码以缩短后续 JVM 的启动时间。AOT 编译代码实际上并不在 JVM 间共享,但在 JVM 启动时载入高速缓存以缩短编译时间。存储在高速缓存中的 AOT 代码总量通过探试决定。您不能控制在高速缓存存储哪些方法,但可以设置 AOT 代码所用高速缓存空间的上下限,或者可以选择完全禁用 AOT 高速缓存。有关更多信息,请参阅类数据共享的启用和配置

高速缓存访问

JVM 可以只读或只写权限访问高速缓存。任何以读写权限连接高速缓存的 JVM 都可以更新高速缓存。允许任意数量的 JVM 同时读取高速缓存,即使其他 JVM 正在向高速缓存写入数据。

如果正在使用运行时字节码修改,那么您必须小心。有关更多信息,请参阅运行时字节码修改

高速缓存的动态更新

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

高速缓存安全性

对共享的类高速缓存的访问受限于操作系统许可权和 Java 安全许可权。只有已注册到共享类数据的类装入器才能更新共享的类高速缓存。

使用内存页面保护,在意外或有意崩溃时,保护高速缓存内存。对于崩溃,这不是绝对安全,因为 JVM 在写入数据时,必须打开保护。防止高速缓存被修改的唯一方式就是以只读权限打开。

如果已安装 Java SecurityManager,那么类装入器(缺省引导程序、应用程序和扩展类装入器除外)必须通过将 SharedClassPermission 行添加到 java.policy 文件来获得共享类的许可权。(请参阅使用 SharedClassPermission。)RuntimePermission 『createClassLoader』限制新类装入器的创建并限制对高速缓存的访问。

高速缓存生存时间

一个系统上可以存在多个高速缓存;这些高速缓存是通过将名称作为 -Xshareclasses 命令的子选项来指定的。JVM 一次只可连接一个高速缓存。

你可以使用 -Xscmx<n><size> 在启动时覆盖缺省的高速缓存大小,然后根据高速缓存的生存期修正高速缓存大小。高速缓存将一直存在,直到使用 -Xshareclasses 命令的子选项显式地将其毁坏,或者手工删除高速缓存文件。

高速缓存实用程序

所有高速缓存实用程序都是 -Xshareclasses 命令的子选项。请参阅类数据共享的启用和配置, 或使用 -Xshareclasses:help 查看可用子选项的列表。

类数据共享的启用和配置

使用 java 启动程序的命令行选项可控制类数据共享和高速缓存管理实用程序。

对于采用 <size> 参数的选项,在数字后面加上"k"或"K"来表示千字节,加上"m"或"M"来表示兆字节,或者加上"g"或"G"来表示千兆字节。

-Xscmaxaot<size>
设置高速缓存中可用于 AOT 数据的字节的最大数量。使用该选项确保非 AOT 数据拥有一定数量的高速缓存空间。缺省情况下,AOT 数据的最大限制就是高速缓存中可用空间的数量。该选项的值不得小于 -Xscminaot 的值并且不得大于 -Xscmx 的值。
-Xscminaot<size>
设置在高速缓存中可为 AOT 数据保留的最小字节数量。缺省情况下,虽然 AOT 数据可持续写入高速缓存直到高速缓存已满或已达到 -Xscmaxaot 限制,但并没有为 AOT 数据保留任何空间。该选项的值不得超过 -Xscmx-Xscmaxaot 的值。-Xscminaot 的值应该始终远小于总的高速缓存大小,因为只能为高速缓存的类创建 AOT 数据。如果 -Xscminaot 的值等于 -Xscmx 的值,那么不会保存类数据或 AOT 数据。因为 AOT 数据必须与高速缓存中的类相关联。
-Xscmx<size>
指定高速缓存大小。此选项只适用于在创建了高速缓存并且不存在同名的高速缓存的情况。缺省高速缓存大小视平台而定。可以通过将 -verbose:sizes 添加为命令行参数来确定正在使用的大小值。最小高速缓存大小为 4 KB。最大高速缓存大小取决于平台。(请参阅高速缓存大小限制。)
-Xshareclasses:<suboption>[,<suboption>...]
启用类数据共享。可以使用很多子选项,其中一些是高速缓存实用程序。高速缓存实用程序对指定的高速缓存执行必需的操作,而不启动 VM。您可以结合使用多个子选项(以逗号分隔),但高速缓存实用程序是互斥的。当运行高速缓存实用程序时,可能会出现消息"无法创建 Java 虚拟机"。高速缓存实用程序没有创建虚拟机。

某些高速缓存实用程序可使用 Java 旧版本的高速缓存或由 JVM 创建的带不同位宽的高速缓存。这些高速缓存被称为『不兼容』高速缓存。

您可以随 -Xshareclasses 选项使用以下子选项:

help
列出所有命令行子选项。
name=<name>
连接到给定名称的高速缓存,如果高速缓存不存在则创建一个。还可以用来表示将用高速缓存实用程序修改(例如破坏)的高速缓存。使用 listAllCaches 实用程序来显示当前哪个指定的高速缓存是可用的。如果不指定名称,那么将使用缺省名称"sharedcc_%u"。高速缓存名称中的 %u 将插入当前的用户名。
cacheDir=<directory>
设置用来读写的高速缓存数据所在的目录。缺省的 <directory> 是用户目录 C:\Documents and Settings\<username>\Local Settings\Application Data\javasharedresources 下的 目录。用户必须具有 <directory> 中的足够权限。缺省方式是 JVM 直接将持久性高速缓存文件写入指定的目录。持久性高速缓存文件可从文件系统中安全地移动或删除。 非持久性高速缓存存储在共享内存中并具有用于描述内存位置的控制文件。控制文件保存在指定的 cacheDir 下的子目录 javasharedresources中。该目录中的控制文件不能手工移动或删除。listAllCaches 实用程序、destroyAll 实用程序以及 expire 子选项仅可在给定的 cacheDir 作用域内使用。
readonly
使用只读权限打开已存在的高速缓存。JVM 将不会使用该子选项创建新的高速缓存。只读地打开高速缓存将阻止 JVM 对高速缓存进行任何更新。它同时允许 JVM 连接到由其他用户或组创建的高速缓存而无需写访问权。缺省情况下,不指定该子选项。
nonpersistent
使用非持久性高速缓存。缺省情况下, JVM 在磁盘上创建高速缓存文件,它将一直存在直到系统重新启动。nonpersistent 子选项当操作系统关闭时,此高速缓存文件将被删除。非持久性和持久性高速缓存可使用相同的名称,在非持久性高速缓存中运行实用程序(如 destroy)时,必须始终使用 nonpersistent 子选项。缺省情况下,不指定该子选项。
verbose
启用 verbose 输出,这将提供共享类高速缓存上的总体状态和错误消息的更多详细信息。
verboseAOT
当在高速缓存中发现或存储已编译的 AOT 代码时启用详细输出。将探索生成 AOT 代码。对于小型应用程序,将根本看不到生成任何 AOT 代码。可使用 noaot 子选项来禁用 AOT 高速缓存。
verboseIO
给出有关高速缓存 I/O 活动的详细输出,列出有关正在存储和查找的列表的信息。每个类装入器都被给定一个唯一的标识(引导程序装入器始终为 0),并且输出显示在工作的类装入器层次结构;在该层次结构中,类装入器必须向它们的父代请求类之后,才能自行装入该类。看到很多失败的请求是正常的;这种行为是类装入器层次结构所预期会出现的。
verboseHelper
启用 Java 助手 API 的详细输出。此输出向您显示类装入器是如何使用助手 API 的。
silent
关闭所有共享类消息,包括错误消息。
nonfatal
即便在类数据共享失败的情况下仍允许 JVM 启动。如果类数据共享失败,JVM 的正常行为是拒绝启动。如果选择 nonfatal 并且共享的类高速缓存未能初始化,JVM 将尝试以只读方式连接高速缓存。如果失败,JVM 将启动,但不具有类数据共享。
none
可以添加到命令行的结尾来禁用类数据共享。此子选项覆盖命令行中先前找到的类共享参数。
modified=<modified context>
在安装了可能在运行时修改字节码的 JVMTI 代理程序时使用。如果不指定此子选项并且安装了字节码修改代理程序,那么将在付出额外的性能代价后安全地共享类。<modified context> 是由用户选择的描述符;例如『myModification1』。此选项对高速缓存进行分区,使得只有使用上下文 myModification1 的 JVM 才可以共享相同的类。例如,如果以某个修改上下文运行 HelloWorld,然后以不同的修改上下文再次运行它,您就会看到所有的类将在高速缓存中存储两次。有关更多信息,请参阅运行时字节码修改
reset
将毁坏高速缓存,然后在 JVM 启动时重新创建。可将其添加到命令行的结尾,如 -Xshareclasses:reset
destroy(实用程序选项)
毁坏由 namecacheDirnonpersistent 子选项指定的高速缓存。只有在使用某个高速缓存的所有 JVM 都已关闭,并且用户具有充分的许可权时,才能毁坏该高速缓存。
destroyAll(实用程序选项)
尝试毁坏使用指定的 cacheDirnonpersistent子选项创建的所有高速缓存。只有在使用某个高速缓存的所有 JVM 都已关闭,并且用户具有充分的许可权时,才能毁坏该高速缓存。
expire=<time in minutes>
在装入类共享之前毁坏所有达到指定未使用时间的高速缓存。这不是实用程序选项,因为它没有导致 JVM 退出。在 NTFS 文件系统上,expire 选项精确到最近的小时。
listAllCaches(实用程序选项)
列出指定的高速缓存目录中存在的所有兼容和不兼容的高速缓存。如果未指定 cacheDir,将使用缺省目录。对于每个高速缓存,将显示摘要信息(如 Java 版本)以及当前使用率。
printStats(实用程序选项)
显示由 namecacheDirnonpersistent 子选项指定的高速缓存的摘要信息。显示的最有用的信息是该高速缓存的充满程度以及它包含多少数量的类。陈旧类是文件系统上已经更新而因此被高速缓存标为"陈旧"的类。陈旧类不会从高速缓存中清除并且可以复用。请参阅 Diagnostics Guide 获取更多信息。
printAllStats(实用程序选项)

显示由 namecacheDirnonpersistent 子选项指定的高速缓存的详细信息。每个类都按时间顺序列出,同时指出装入该类的来源位置。也将列出类方法的 AOT 代码。

请参阅

请参阅 Diagnostics Guide 获取更多信息。

mprotect=[ all | default | none ]
缺省情况下,内存页面包含一直保护的高速缓存,除非特定页面被更新。这有助于在意外或有意崩溃时保护高速缓存。缺省情况下不保护高速缓存头,因为这个性能代价很小。指定"all"会确保保护所有高速缓存页面,包含头部。指定"none"将禁用页面保护。
noBootclasspath
阻止共享类高速缓存中由引导程序类装入器装入的类的存储。与 SharedClassURLFilter API 一起使用来精确控制对哪些类进行高速缓存。有关共享类过滤的更多信息,请参阅 Diagnostics Guide
cacheRetransformed
启用对已使用 JVMTI RetransformClasses 函数变换的类的高速缓存。
noaot
禁用对 AOT 代码的高速缓存和装入。

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

共享类数据高速缓存(包含高速缓存管理实用程序的示例)的生命周期的概述。

要启用类数据共享,请将 -Xshareclasses[:name=<name>] 添加到应用程序命令行中。

JVM 要么连接到具有给定名称的现有高速缓存,要么创建一个具有此名称的高速缓存。如果已经创建了一个新的高速缓存,那么将会给它植入所有装入的引导程序和应用程序类,直至高速缓存变满为止。如果并发启动了两个或更多 JVM,它们将并发地填充高速缓存。

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

有关 JVM 正在运行时高速缓存使用情况的更多反馈,请使用 verbose 子选项。例如,java -Xshareclasses:[name=<name>],verbose

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

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

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

如果高速缓存已满,那么一条消息将输出到任何使用详细子选项的 JVM 的命令行上。然后,所有共享已满的高速缓存的 JVM 都将多余的类装入到各自的进程内存中。在已满的高速缓存中的类仍然能够共享,但已满的高速缓存是只读的,而无法使用新类进行更新。

性能和内存消耗

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

创建和植入新高速缓存的开销非常小。根据装入的类的数量,一个 JVM 的 JVM 启动成本(指所花时间)通常比没有使用类数据共享的系统要慢 0-5%。根据操作系统和装入类的数量,使用填充的高速缓存后,JVM 启动时间得到改善,通常比没有使用类数据共享的系统要快 10%-40%。并发运行多个 JVM 将更大幅度地减少整体启动时间。

复制类在共享的类高速缓存中被合并。例如,从 myClasses.jar 装入的类 A 和从 myOtherClasses.jar 装入的类 A(居于相同的内容)只在高速缓存中存储一次。printAllStats 实用程序显示复制类的多个条目,而每个条目都指向相同的类。

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

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

在产品中部署类数据共享以及在部署环境中使用类数据共享时需要考虑的因素。

高速缓存大小限制

高速缓存的最大理论大小是 2 GB。可指定的高速缓存的大小受到可用磁盘空间和可用虚拟地址空间的数量的限制。

高速缓存受以下因素的限制:

运行时字节码修改

如果任何使用可修改字节码数据的 JVM 工具接口(JVMTI)代理程序的 JVM 需要与其他 JVM 共享所修改的类,那么它们均应该使用 modified=<modified_context> 子选项。

修改的上下文是一个由用户指定的描述符,它描述所执行修改的类型。修改的上下文对高速缓存进行分区,这样所有在同一上下文运行的高速缓存都可以共享一个分区。

这种分区使未使用修改字节码的 JVM 可安全地与已使用字节码的 JVM 共享高速缓存。所有使用给定的已修改上下文的 JVM 均必须以可预测和可重复的方式来修改每个类的字节码,这样高速缓存中所存储的已修改类在其他 JVM 装入它们时就可以有预期的修改。任何修改都必须可预测的,因为代理程序无法重新修改从共享的类高速缓存装入的类。

如果使用的 JVMTI 代理程序不具有修改上下文,那么 JVM 仍可安全地共享类,但是会对性能产生较小的影响。将修改上下文与 JVMTI 代理程序结合使用可避免额外检查的需要,从而对性能不会产生影响。扩展 java.net.URLClassLoader 并在装入时间不使用 JVMTI 修改字节码的定制 ClassLoader 自动将该修改的字节码存储到高速缓存中,但是高速缓存并不把此字节码当作修改的字节码。任何共享此高速缓存的 VM 都将装入修改的类。可以使用与 JVMTI 代理程序相同的方式使用 modified=<modification_context> 子选项对高速缓存中的修改字节码进行分区。如果定制 ClassLoader 需要对类进行不可预测的装入时间修改,此 ClassLoader 不得尝试使用类数据共享。

请参阅 Diagnostics Guide 获取更多有关此主题的详细信息。

操作系统局限性

您不能在 32 位和 64 位 JVM 之间共享类。必须具有临时的可用磁盘空间以容纳高速缓存信息。高速缓存许可权由操作系统强制实行。

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

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

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

使用 SharedClassPermission

如果结合类数据共享来使用 SecurityManager,并且运行的应用程序使用其自己的类装入器,那么这些类装入器必须在获得共享类许可权之后才能共享类。

你可以使用 ClassLoader 类名(允许使用通配符),同时使用"read"、"write"或"read,write"确定授予的访问权,来将共享类许可权添加到 java.policy 文件。例如:

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

如果 ClassLoader 不具备正确的许可权,将阻止它共享类。您不能更改缺省引导程序、应用程序,或扩展类装入器的许可权。

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

任何扩展 java.net.URLClassLoader 的类装入器都可以共享类而不用修改。未使用 java.net.URLClassLoader 的类装入器需经过修改才能使用共享类数据。

如果正在使用 SecurityManager,那么必须向所有定制类装入器授予共享类许可权,请参阅使用 SharedClassPermission。IBM 为各种类型的定制类装入器提供了几个 Java 接口,使类装入器能够在共享类高速缓存中找到和存储类。这些类包含在 com.ibm.oti.shared 程序包中。

用于该程序包的 Javadoc 随 SDK 在 docs/content/apidoc 目录中提供。

有关使用这些接口的更多信息,请参阅 Diagnostics Guide

使用 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 V6 Runtime Environment 的系统上受到支持。

使用 Java Communications API,您可以:

从压缩的文件安装 Java Communications API

在安装 Java Communications API 之前,确保已安装了 SDK 或 Runtime Environment。

要从压缩文件安装 Java Communications API:

  1. 将 Java 通信 API 压缩文件 ibm-javacomm-3.0-0.0-win-x86_64.zip 放置在 SDK 或 Runtime Environment 的安装目录中。如果先前安装到了缺省目录,那么它是 C:\Program Files\IBM\Java60\。
  2. 抽取压缩文件。 Java Communications API 被抽取到现有目录的子目录中。
  3. 将 javacomm 文件复制到 SDK 内的正确目录中。
    1. 将 lib\win64com.dll 复制到 jre\bin\ 目录中。
    2. 将 jar\comm.jar 复制到 jre\lib\ext\ 目录中。
    3. 将 lib\javax.comm.properties 复制到 jre\lib\ 目录中。
    缺省情况下,SDK 安装在 C:\Program Files\IBM\Java60\ 目录中。
  4. 将 comm.jar 添加到类路径中。 对于 JRE 安装,这不是必需的步骤。

在 javax.comm.properties 文件中指定设备

利用文件 javax.comm.properties,您可以指定可用于 Java 通信 API 的设备的前缀,以及指定它们是并行的还是串行的。端口号按顺序分配给所有设备。

例如,如果指定 /dev/ttyS=PORT_SERIAL,并且设备 /dev/ttyS0/dev/ttyS1 存在,那么将向它们分配 COM1 和 COM2。

要使用 USB 串行接口,请在 javax.comm.properties文件中取消注释 /dev/ttyUSB=PORT_SERIAL 一行。如果设备 /dev/ttyUSB0/dev/ttyUSB1 存在,但已经定义了 COM1 和 COM2,那么 USB 串行设备会被分配接下来的连续端口,即 COM3 和 COM4。

Java Communications API 的打印局限性

当使用 Java Communications API 打印时,您可能必须在打印机上按下『进纸』、『继续』或类似按键。

卸载 Java Communications API

要卸载 Java Communications API,请从安装了 Runtime Environment 的目录中删除以下文件:

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

Java Communications API 文档

您可以在 Sun Web 站点上找到 Java Communications API 的 API 文档和样本。

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

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

服务的联系点:

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

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

辅助功能选项

随此 SDK 和 Runtime Environment 提供的《用户指南》已使用屏幕阅读器进行过测试。

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

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

Swing 中 JComboBox 组件的键盘遍历

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

有关安全性的一般注释

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

是否对本用户指南持有任何意见?

如果对本用户指南具有任何意见,请通过以下任一方法与我们联系。请注意设置这些方法不是为了回答技术查询方面的问题,而是仅针对有关文档的意见。

请通过以下方法发送您的意见:

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

附录 A. 非标准选项

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

对于采用 <size> 参数的选项,在数字后面加上"k"或"K"来表示千字节,加上"m"或"M"来表示兆字节,或者加上"g"或"G"来表示千兆字节。

对于采用 <percentage> 参数的选项,使用从 0 到 1 的数字,例如 50% 即 0.5。

-Xargencoding
使您能够在参数列表中放置 Unicode 转义序列。缺省情况下,此选项设置为关闭。
-Xbootclasspath:<directories and zip or jar files separated by :>
设置引导程序类和资源的搜索路径。缺省情况下,会在内部 VM 目录和 .jar 文件中搜索引导程序类和资源。
-Xbootclasspath/a:<directories and zip or jar files separated by :>
将指定的目录、zip 或 jar 文件附加到引导程序类路径的结尾。缺省情况下,会在内部 VM 目录和 .jar 文件中搜索引导程序类和资源。
-Xbootclasspath/p:<directories and zip or jar files separated by :>
将指定的目录、zip 或 jar 文件附加到引导程序类路径的开头。不要部署使用 -Xbootclasspath:-Xbootclasspath/p: 选项覆盖标准 API 中的某个类的应用程序,这是因为此类部署将与 Java Runtime Environment 二进制代码许可证相抵触。缺省情况下,会在内部 VM 目录和 .jar 文件中搜索引导程序类和资源。
-Xcheck:classpath
如果在类路径中发现错误(如目录或 JAR 文件丢失),显示警告消息。
-Xcheck:gc[:<scan options>][:<verify options>][:<misc options>]
对垃圾回收执行附加检查。缺省情况下,不执行任何检查。有关更多信息,请参阅 -Xcheck:gc:help 的输出。
-Xcheck:jni
对 JNL 函数执行附加检查。缺省情况下,不执行任何检查。
-Xcheck:memory[:<option>]
使用严格检查识别 JVM 中导致 JVM 因故障退出的内存泄漏。如果未指定选项,将缺省使用 all。有关更多信息,请参阅 -Xcheck:memory:help 的输出或 Diagnostics Guide
-Xcheck:nabounds
对 JNL 函数执行附加检查。缺省情况下,不执行任何检查。
-Xclassgc
在每次执行垃圾回收时启用类对象回收。另见 -Xnoclassgc。缺省情况下,启用此选项。
-Xcodecache<size>
设置分配用来存储已编译的 Java 方法的本机代码的内存块单元大小。可以为正在运行的应用程序选择适当的大小。缺省情况下,此选项是根据 CPU 体系结构和系统能力在内部选择的。
-Xcompactexplicitgc
对每个 System.gc() 的调用执行压缩。另见 -Xnocompactexplicitgc。缺省情况下,压缩只在内部触发时,才会发生。
-Xcompactgc
对每个垃圾回收执行压缩。另见 -Xnocompactgc。缺省情况下,压缩只在内部触发时,才会发生。
-Xconcurrentbackground<number>
指定连接的、用来在并发标记中辅助增变线程的低优先级后台线程的数量。缺省值为 1。
-Xconcurrentlevel<number>
指定分配"税"率。它指示分配的堆总量与标记的堆总量之间的比率。缺省值为 8。
-Xconmeter:<soa|loa|dynamic>
确定测量哪一个区域(LOA,大对象区域或 SOA,小对象区域)的使用情况,并因此在并发标记的过程中对哪些分配进行"征税"。此分配税仅适用于所选择的区域。如果指定了 -Xconmeter:dynamic,收集器将根据哪个区域首先耗尽来动态地确定要测量的区域。缺省情况下,此选项设置为 -Xconmeter:soa
-Xdbg:<options>
装入调试库以支持远程调试应用程序。有关更多信息,请参阅调试 Java 应用程序。指定 -Xrunjdwp 可提供相同的支持。
-Xdebug
启动已启用调试器的 JVM。缺省情况下,禁用调试器。
-Xdisableexcessivegc
禁止当在 GC 中花费过多的时间时抛出 OutOfMemoryError。缺省情况下,此选项为关闭。
-Xdisableexplicitgc
通知 VM 调用 System.gc() 的信号可能无效。缺省情况下,对 System.gc() 的调用会触发垃圾回收。
-Xdisablestringconstantgc
防止收集字符串保留区表中的字符串。缺省情况下,禁用此选项。
-Xdisablejavadump
关闭在出现错误和信号时的 Javadump 生成。缺省情况下,启用 Javadump 生成。
-Xenableexcessivegc
如果在 GC 中花费过多的时间,此选项就会对分配请求返回 NULL,并因此导致抛出 OutOfMemoryError。只有在堆已完全扩展并且 GC 占用了 95% 的可用时间时,才会发生此操作。此行为是缺省行为。
-Xenableexplicitgc
通知 VM 调用 System.gc() 应触发垃圾回收。这是缺省值。
-Xenablestringconstantgc
启用收集来自字符串保留区表的字符串。缺省情况下,启用此选项。
-Xfuture
打开严格的类文件格式检查。当开发新代码时,请使用此标志,因为在将来的发行版中,缺省情况下会执行较严格的检查。缺省情况下,禁用严格的格式检查。
-Xgcpolicy:<optthruput|optavgpause|gencon>
控制垃圾收集器的行为。有关更多信息,请参阅垃圾回收选项
-Xgcthreads<number of threads>
设置在垃圾回收过程中用于并发操作的助手线程的数量。缺省情况下,线程的数量设置为存在的物理 CPU 数 -1,最小值为 1。
-Xgcworkpackets<number>
指定在全局收集器中可用工作包的总数。如果未指定,收集器将根据最大堆大小来分配包的数量。
-Xint
使 JVM 只使用解释器,同时禁用 Just-In-Time(JIT)编译器。缺省情况下,启用 JIT 编译器。
-Xiss<size>
设置初始 Java 线程堆栈大小。缺省情况下为 2 KB。使用 -verbose:sizes 选项输出 VM 正在使用的值。
-Xjarversion
请参阅获取版本信息
-Xjit[:<suboption>,<suboption>...]
启用 JIT。有关子选项的详细信息,请参阅 Diagnostics Guide。另见 -Xnojit。缺省情况下,启用 JIT。
-Xlinenumbers
显示堆栈跟踪中的行数,用于调试。另见 -Xnolinenumbers。缺省情况下,行数为打开。
-Xloa
分配大对象区域(LOA)。对象将被分配到此 LOA 中而不是 SOA 中。缺省情况下,除了 subpool(LOA 在该处不可用),对所有的 GC 策略都启用 LOA。另见 -Xnoloa
-Xloainitial<percentage>
<percentage> 介于 0 和 0.95 之间,该数指定当前分配给大对象区域(LOA)的永久占有空间的初始百分比。缺省值为 0.05 或 5%。
-Xloamaximum<percentage>
<percentage> 介于 0 和 0.95 之间,该数指定当前分配给大对象区域(LOA)的永久占有空间的最大百分比。缺省值为 0.5 或 50%。
-Xlp(Windows 2003)
请求 JVM 以大页面分配 Java 堆。如果大页面不可用,JVM 将不会启动,并显示错误消息 GC:系统配置不支持选项 -->"-Xlp"。运行 Windows 2003 的系统(它们的操作系统被设置为使用大页面)都支持大页面。缺省情况下,不使用大页面。请参阅配置大页面内存分配
-Xmaxe<size>
设置垃圾收集器扩展堆所依照的最大数量。通常,当可用空间量降到低于 30%(或降到使用 -Xminf 指定的数量)时,垃圾收集器按照将可用空间恢复到 30% 所需的数量扩展堆。-Xmaxe 选项将扩展限制为指定的值;例如 -Xmaxe10M 将扩展限制为 10 MB。缺省情况下,没有最大扩展大小。
-Xmaxf<percentage>
指定在垃圾回收之后必须可用的堆最大百分比。如果可用空间超出此数量,JVM 将尝试缩小堆。缺省值为 0.6(60%)。
-Xmca<size>
为分配用来存储所装入类的 RAM 部分的内存设置扩展步幅。每次需要更多内存来在 RAM 中存储类时,分配的内存就按照此数量增长。缺省情况下,扩展步幅为 32 KB。使用 -verbose:sizes 选项输出 VM 正在使用的值。
-Xmco<size>
为分配用来存储所装入类的 ROM 部分的内存设置扩展步幅。每次需要更多内存来在 ROM 中存储类时,分配的内存就按照此数量增长。缺省情况下,扩展步幅为 128 KB。使用 -verbose:sizes 选项输出 VM 正在使用的值。
-Xmine<size>
设置垃圾收集器扩展堆所依照的最小数量。通常,垃圾收集器按照将可用空间恢复到 30% 所需的内存量(或按照 -Xminf 指定的数量)扩展堆。-Xmine 选项将扩展设置为至少是指定的值;例如 -Xmine50M 将扩展大小设置为最小 50 MB。缺省情况下,最小扩展大小为 1 MB。
-Xminf<percentage>
指定在垃圾回收之后应该可用的堆最小百分比。如果可用空间降到低于此数量,JVM 将尝试扩展堆。缺省情况下,最小值为 0.3(30%)。
-Xmn<size>
使用 -Xgcpolicy:gencon 时,将新的(短期存在)堆的初始和最大大小设置为指定的值。设置 -Xmn 相当于设置 -Xmns-Xmnx如果设置了 -Xmns-Xmnx,就不能设置 -Xmn。如果尝试连同 -Xmns-Xmnx 设置 -Xmn,VM 将不启动,并返回错误。缺省情况下,-Xmn 是根据您的系统的能力在内部选择的。使用 -verbose:sizes 选项输出 VM 正在使用的值。
-Xmns<size>
使用 -Xgcpolicy:gencon 时,将新的(短期存在)堆的初始大小设置为指定的值。缺省情况下,此选项是根据您的系统的能力在内部选择的。如果尝试将此选项与 -Xmn 结合使用,它将返回错误。使用 -verbose:sizes 选项输出 VM 正在使用的值。
-Xmnx<size>
使用 -Xgcpolicy:gencon 时,将新的(短期存在)堆的最大大小设置为指定的值。缺省情况下,此选项是根据您的系统的能力在内部选择的。如果尝试将此选项与 -Xmn 结合使用,它将返回错误。使用 -verbose:sizes 选项输出 VM 正在使用的值。
-Xmo<size>
使用 -Xgcpolicy:gencon 时,将旧的(永久占有)堆的初始和最大大小设置为指定的值。相当于同时设置 -Xmos-Xmox如果设置了 -Xmos-Xmox,就不能设置 -Xmo。如果尝试连同 -Xmos-Xmox 设置 -Xmo,VM 将不启动,并返回错误。缺省情况下,-Xmo 是根据您的系统的能力在内部选择的。使用 -verbose:sizes 选项输出 VM 正在使用的值。
-Xmoi<size>
使用 -Xgcpolicy:gencon 时,设置 Java 堆递增的数量。如果设置为零,将不允许扩展。缺省情况下,增量大小是根据扩展大小 -Xmine-Xminf 计算的。
-Xmos<size>
使用 -Xgcpolicy:gencon 时,将旧的(永久占用)堆的初始大小设置为指定的值。缺省情况下,此选项是根据您的系统的能力在内部选择的。如果尝试将此选项与 -Xmo 结合使用,它将返回错误。使用 -verbose:sizes 选项输出 VM 正在使用的值。
-Xmox<size>
使用 -Xgcpolicy:gencon 时,将旧的(永久占用)堆的最大大小设置为指定的值。缺省情况下,此选项是根据您的系统的能力在内部选择的。如果尝试将此选项与 -Xmo 结合使用,它将返回错误。使用 -verbose:sizes 选项输出 VM 正在使用的值。
-Xmr<size>
使用 -Xgcpolicy:gencon 时,设置垃圾回收"记忆设置"的大小。这是老的(永久占有)堆中的对象列表,该堆引用了新的(短期存在)堆中的对象。缺省情况下,此选项设置为 16 千字节。使用 -verbose:sizes 选项输出 VM 正在使用的值。
-Xmrx<size>
设置记忆的最大大小设置。
-Xms<size>
设置初始 Java 堆大小。您也可以使用 -Xmo。缺省值将根据系统的能力在内部设置。使用 -verbose:sizes 选项输出 VM 正在使用的值。
-Xmso<size>
设置派生的 Java 线程的 C 堆栈大小。缺省情况下,此选项在 32 位平台上设置为 32 KB,在 64 位平台上设置为 256 KB。使用 -verbose:sizes 选项输出 VM 正在使用的值。
-Xmx<size>
设置最大 Java 堆大小。缺省情况下,此选项是根据您的系统的能力在内部设置的。 使用 -verbose:sizes 选项输出 VM 正在使用的值。
-Xnoclassgc
禁用类垃圾收集。此选项关闭与 JVM 不再使用的 Java 类关联的存储的垃圾回收。另见 -Xclassgc。缺省情况下,执行类垃圾回收。
-Xnocompactexplicitgc
禁用在对 System.gc() 的调用上的压缩。另见 -Xcompactexplicitgc。缺省情况下,在对 System.gc() 的调用上启用压缩。
-Xnocompactgc
禁用垃圾收集器压缩。另见 -Xcompactgc。缺省情况下,启用压缩。
-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<size>
设置任意线程的 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
-Xrunjnichk[:help] | [:<option>=<value>, ...]
不推荐,请使用 -Xcheck:jni
-Xscmx<size>
要获取 -Xscmx 的详细信息,请参阅类数据共享的启用和配置
-Xshareclasses:<options>
要获取 -Xshareclasses 选项的详细信息,请参阅类数据共享的启用和配置
-Xsigcatch
启用 VM 信号处理代码。另见 -Xnosigcatch。缺省情况下,启用信号处理。
-Xsigchain
启用信号处理程序链接。另见 -Xnosigchain。缺省情况下,启用信号处理程序链接。
-Xsoftrefthreshold<number>
设置当没有标记软引用的引用目标时将在经过多少次 GC 后清除软引用。缺省值为 3,意味着如果没有标记引用目标,就在第三次 GC 时清除软引用。
-Xss<size>
设置任意线程的最大 Java 堆栈大小。缺省情况下,此选项设置为 256 KB。使用 -verbose:sizes 选项输出 VM 正在使用的值。
-Xthr:<options>
设置线程选项。
-Xverbosegclog:<path to file>[X,Y]

导致详细垃圾回收(GC)输出被写入指定文件。如果文件已经存在会被覆盖掉。否则,如果一个已存在文件不能被打开或者新文件不能被创建,输出会被重定向到 stderr。如果您指定参数 X 和 Y(两个参数都是整数),那么详细 GC 输出将被重定向到 X 个文件,每个文件都包含 Y 个值得详细 GC 输出的 gc 循环。这些文件的格式有:filename1、filename2 等等。缺省情况下,不记录详细 GC。

请参阅 Diagnostics Guide 获取更多有关详细 GC 输出的信息。

-Xverify
启用对装入的每个类的严格类检查。缺省情况下,禁用严格类检查。
-Xverify:none
禁用严格类检查。缺省情况下,禁用严格类检查。

附录 B. 已知局限性

有关 SDK 和 Runtime Environment for Windows 的已知局限性。

http://www.ibm.com/developerworks/java/jdk/diagnosis/60.html 处的 Diagnostics Guide 中,您可以找到更多有关问题诊断的帮助。

AMD64 SMP 系统上的 BIOS 设置

Node memory interleaving BIOS 设置必须设置为 DISABLED。否则,可能发生不可预测的结果,包括 Java 崩溃和挂起。此指示信息与 AMD 的建议一致。

受支持的语言环境中的字体问题

IBM 64-bit SDK for Windows, V6 支持以下语言环境:

但这些语言环境的字体可能无法在 AWT 组件上显示。

在 IPv6 使用套接字

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

JConsole 监视工具"本地"选项卡

在 IBM 的 JConsole 工具中,允许您连接相同系统上其他虚拟机的本地选项卡不可用。并且,对应的命令行 pid 选项也不可用。相反,请使用 JConsole 中的远程选项卡来连接要监视的虚拟机。或者。也可以使用 connection 命令行选项,指定 localhost 为主机以及端口号。当启动要监视的应用程序时,请设置以下命令行选项:

-Dcom.sun.management.jmxremote.port=<value>
指定管理代理程序应该侦听的端口。
-Dcom.sun.management.jmxremote.authenticate=false
在创建用户名之前禁用认证。
-Dcom.sun.management.jmxremote.ssl=false
禁用 SSL 加密。

Rhino Javascript 引擎不可用

由于许可问题,Mozilla Rhino Javascript 引擎未包含在 IBM SDK for Java 中。要将 Rhino Javascript 引擎用于 IBM SDK for Java,请从 https://scripting.dev.java.net/ 下载 jsr223 脚本生成引擎,并从 Mozilla Web 站点(http://www.mozilla.org/rhino/)下载 Rhino Javascript 引擎。

输入方法编辑器(IME)

当使用输入法编辑器(IME)时,建议您在使用工作空间进行任何其他操作之前完成字符构成操作以及候选字的选择。

如果在使用输入方法编辑器(IME)的同时,用户在 AWT 文本区域输入文本,然后在提交文本之前调整应用程序窗口,那么文本会自动提交。

DSA 密钥对生成较慢

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

个人防火墙

个人防火墙可能导致 Windows NIO 代码出现问题,引起特定操作的失败。例如,方法调用 Selector.open() 可能因『java.net.ConnectException:连接被拒绝:连接』而抛出『java.io.IOException:无法建立绕回连接』。该异常是由在防火墙阻塞的端口上进行连接的操作系统导致的。JVM 将重试连接操作,要求操作系统选择一个不同的端口号。如果在几次重试以后仍无法连接,将抛出 ConnectException。

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

文件句柄耗尽

在 Windows XP 上,可以同时打开的文件数量的缺省值太低,这导致 I/O 密集的应用程序出现问题。要修正此局限性,请编辑文件 <windows>\system32\CONFIG.NT 并设置以下值:

files=200buffers=60

其中,<windows> 是安装 Windows 的目录。

DBCS 字符

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

捷克语安装

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

繁体中文和 more 命令

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

日语 MS-IME 和 Windows XP 主题

如果在 Windows 上使用日语 MS-IME,那么 64 位 SDK 可能使 Windows XP 主题出错。为了避免这些错误,请设置环境变量 IBMJAVA_USE_WINDOWS_CLASSIC_THEME 强制 Java GUI 窗口使用 Windows 经典主题显示,或者将系统主题更改为 Windows 经典。有关此局限性的更多信息,请参阅 Microsoft(R) Knowledge Base Article 905843(仅限日语)。

带有 GTK 外观的 NullPointerException

仅 DBCS 环境

如果应用程序使用 GTK 外观无法启用 NullPointerException,请取消设置 GNOME_DESKTOP_SESSION_ID 环境变量。

Unicode Shift_JIS 代码页别名

仅日语用户

Shift_JIS 的代码页别名"\u30b7\u30d5\u30c8\u7b26\u53f7\u5316\u8868\u73fe"已被除去。如果您在应用程序中使用此代码页,请用 Shift_JIS 来代替它。

声明

本信息是为在美国提供的产品和服务编写的。IBM 可能在其他国家或地区不提供本文档中讨论的产品、服务或功能特性。有关您所在区域当前提供的产品和服务的信息,请向您当地的 IBM 代表咨询。

任何对 IBM 产品、程序或服务的引用并非意在明示或暗示只能使用 IBM 的产品、程序或服务。只要不侵犯 IBM 的知识产权,任何同等功能的产品、程序或服务,都可以代替 IBM 产品、程序或服务。但是,评估和验证任何非 IBM 产品、程序或服务,则由用户自行负责。

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

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

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

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

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

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

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

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

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

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

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

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

商标

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

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

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

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