# IBM 31 位元 Runtime Environment for Linux on zSeries，Java 2 Technology Edition 1.4.1 版; 使用手冊

# 版權資訊

附註：在使用本資訊及其支援的產品之前，請務必閱讀注意事項下的一般資訊。

本使用手冊修訂版適用於 IBM 31 位元 Runtime Environment for Linux on zSeries，Java 2 Technology Edition 1.4.1 版， 以及所有後續版次與修正，直到新的修訂版中另有指示為止。

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

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

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

# 前言

IBM(R) 31 位元 Runtime Environment for Linux on zSeries(R)，Java(TM) 2 Technology Edition 1.4.1 版 包含 Java Virtual Machine (JVM)、 Sun Microsystems Java 核心類別及支援檔案。Runtime Environment 不包含 SDK 套件中的所有類別。

本「使用手冊」提供 Runtime Environment 的一般資訊，以及 IBM 與 Sun 在 Runtime Environment 實作差異上的特定資訊。 請搭配 Sun 網站上更豐富的文件來閱讀本「使用手冊」，網址是： http://java.sun.com。

關於已測試 SDK for Linux 的發行版清單， 請參閱：http://www-106.ibm.com/developerworks/java/jdk/linux/tested.html

請注意，Runtime Environment for Linux 是 SDK 的一個子集， 只能讓您執行 Java 應用程式。若您已安裝 SDK， 則已包含 Runtime Environment。

"Runtime Environment" 和 "Java Virtual Machine" 這兩個術語在本「使用手冊」中交互使用。

當您閱讀本 1.4.1 版使用手冊的 HTML 版本或彩色印行本時，其技術變更（非次要或明顯之變更，如將 "1.4.0" 更新為 "1.4.1"）均會以紅字標明，且在變更處左側也會加上垂直線。

# 目錄

版權資訊

前言

總覽

- 版本相容性
- Runtime Environment for Linux 包含的檔案
- 授權合約
- Just-In-Time (JIT) 編譯器
- 原生方法介面和 Java 原生介面

  配置 Runtime Environment for Linux

  解除安裝 Runtime Environment for Linux

- 解除安裝可安裝 Red Hat Package Manager (RPM) 套件
- 解除安裝壓縮的 Tape Archive (TAR) 套件

  啟動 Java 應用程式

- 指令摘要
- 選項
- 標準選項
- 非標準選項
- java 指令的全球化
- 使用類別路徑
- |JVM 如何處理信號
- |JVM 使用的信號
- |鏈結原生的程式碼驅動程式與信號鏈結程式庫
- 使用 bootclasspath
- 指定記憶體收集原則
- 暫停時間
- 減少暫停時間
- 資料堆填滿的環境
- 關於記憶體收集的進一步資訊

  取得 IBM 建置和版本號碼

  使用浮點堆疊

  在雙位元組字集語言中切換輸入法

  Runtime 範例

  在使用者的系統上安裝您的應用程式

  已知限制

  注意事項

- 商標

  # 總覽

  Runtime Environment for Linux 包含建立 Java Runtime 環境和執行 Java 程式所需的類別子集。 也包含 Java Virtual Machine、Java 類別及支援檔案。 Runtime Environment for Linux 只包含 SDK 中的一部份類別。

  ## 版本相容性

  |能夠在 SDK for Linux 的 |1.1.8、1.2.2 或 1.3.1 版中執行的任何 Applet 或應用程式，應該都可以在此版本中正確執行。 |依附於 Sun Java 1.4.1 API 的 Applet 只能在支援 |Java 1.4.1 API 的瀏覽器上運作。

  以 1.4.1 編譯的類別不保證可以在 1.4.0 以前的 Runtime Environment 版次中運作。

  ## Runtime Environment for Linux 包含的檔案

  Runtime Environment for Linux 包含不可除錯的 .so 檔案和在 Runtime 支援程式所需要的類別檔。 Runtime Environment for Linux 不包含任何開發工具，例如 appletviewer 或 javac，或專屬於某個開發系統的類別。

  ## 授權合約

  LICENSE_xx.html 檔案包含 Runtime Environment for Linux 軟體的授權合約。(xx 是語言的縮寫。)

  若要檢視或列印授權合約，請在 Web 瀏覽器中開啟檔案。

  ## Just-In-Time (JIT) 編譯器

  Just-In-Time (JIT) 編譯器 (libjitc.so) 會在 Java 應用程式和 Applet 執行時，動態地產生其中常用之位元組碼序列的機器碼。

  Runtime Environment for Linux 包括 預設會啟用的 JIT 編譯器 (libjitc.so)。您可以停用 JIT，以便從 Java 應用程式、Applet 或編譯器本身中，將問題分離出來。

  若要停用 JIT，請在您仍然執行應用程式的視窗中，在 shell 提示上鍵入：

      export JAVA_COMPILER=NONE

  若要啟用 JIT，請在 Shell 提示下輸入：

          export JAVA_COMPILER=jitc

  若要驗證否是已啟用 JIT，請在 Shell 提示下輸入：

          java -version

  如果 JIT 已在使用中，便會顯示一則包含下列內容的訊息：

      (JIT enabled: jitc)

  如果 JIT 不在使用中，便會顯示包含下列字串的訊息：

      (JIT disabled)

  ## 原生方法介面和 Java 原生介面

  IBM 在這個版次中不支援「原生方法介面」。請勿在您的應用程式中使用此介面。

  Runtime Environment 內含「Java 原生介面 (JNI)」。 如需使用 JNI 的相關資訊，請參閱 Sun 網站：http://java.sun.com。

  # 配置 Runtime Environment for Linux

  安裝 Runtime Environment for Linux 之後，請編輯您的 Shell 登入 Script，將此目錄新增至您的 PATH 陳述式中：

  /opt/IBMJava2-s390-141/jre/bin

  若您將 Runtime Environment for Linux 安裝在 /opt/IBMJava2-s390-141/ 以外的目錄，請將 /opt/IBMJava2-s390-141/ 取代成您安裝 Runtime Environment for Linux 的目錄。

  # 解除安裝 Runtime Environment for Linux

  您移除 Runtime Environment for Linux 的程序視您安裝的是可安裝 Red Hat Package Manager (RPM) 套件或壓縮的 Tape Archive (TAR) 套件而定。相關指示，請參閱解除安裝可安裝 Red Hat Package Manager (RPM) 套件或解除安裝壓縮的 Tape Archive (TAR) 套件。

  ## 解除安裝可安裝 Red Hat Package Manager (RPM) 套件

  若您要在已安裝可安裝的 RPM 套件之後解除安裝 Runtime Environment for Linux：

  1. 在 Shell Script 上，鍵入：

             rpm -e IBMJava2-JRE-1.4.1

     另外，您也可以使用圖形式工具， 例如 kpackage 或 yast2

  2. 從 PATH 陳述式中移除您已安裝 Runtime Environment 的目錄。

  ## 解除安裝壓縮的 Tape Archive (TAR) 套件

  若您要在已安裝壓縮的 TAR 套件之後解除安裝 Runtime Environment for Linux：

  1. 從您已安裝 Runtime Environment 的目錄中移除 Runtime Environment 檔案。

  2. 從 PATH 陳述式中移除您已安裝 Runtime Environment 的目錄。

  # 啟動 Java 應用程式

  java 工具可以啟動 Java 應用程式。

  JVM 會在下列三個地方搜尋啟動類別及其他用到的類別： bootstrap 類別路徑、已安裝的延伸項目及使用者類別路徑。 類別名稱或 JAR 檔案名稱後面的引數會傳遞給 main 函數。

  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 一起使用。
  argument
    傳遞給 main 函數的引數。

  若指定 -jar 選項，則指名的 JAR 檔案要包含應用程式的類別和資源檔， 且以 Main-Class 處理標題來表示啟動類別。

  ## 選項

  此啟動程式有一組標準選項為目前的 Runtime 環境所支援， 在未來的版次中也將支援。此外，還有一組非標準的選項。

  ### 標準選項

    -D<property_name>=<值>

      設定系統內容。

    -assert

      列印 assert 相關選項的說明。

    -cp 或 -classpath <以 間隔的目錄和 zip 或 jar 檔案:>

      設定應用程式類別和資源的搜尋路徑。若不使用 -classpath 和 -cp ，且未設定 CLASSPATH，則使用者類別路徑預設為現行目錄 (.)。另請參閱使用類別路徑。

    -help 或 -?

      列印用法訊息。

    -showversion

      列印產品版本並繼續。

    -verbose[:class | gc | jni]

      啟用詳細輸出。

    -version

      列印產品版本。

    -X

      列印非標準選項的說明。

  ### 非標準選項

  下面列示的 -X 選項是可用選項的子集。 它們不是標準選項，可能隨時變動，且不另行通知。

    -Xargencoding

      允許 java 指令上的選項使用 Unicode 跳脫字元來代表語言環境字集中缺少的字元。 Unicode 跳脫字元的格式為 \u####，其中 # 是十六進位數字。

    -Xbootclasspath:<以 ; 間隔的目錄和 zip 或 jar 檔案>

      設定 bootstrap 類別和資源的搜尋路徑。尚有其他方法可以設定 bootclasspath。請參閱使用 bootclasspath。|請勿部署使用此選項來置換 |core.jar、graphics.jar、server.jar、security.jar、xml.jar、tools.jar |或 charsets.jar 中之類別的應用程式，因為這樣的部署已觸犯 Java 2 Runtime |Environment 二位元碼軟體授權。

    -Xbootclasspath/a:<以 ; 間隔的目錄和 zip 或 jar 檔案>

      附加到 bootstrap 類別路徑尾端。

    |-Xbootclasspath/p:<以 ; 間隔的目錄和 zip 或 jar 檔案> |

      |置於 bootstrap 類別路徑的開頭。請勿部署使用此選項來置換 |core.jar、graphics.jar、server.jar、security.jar、xml.jar、tools.jar |或 charsets.jar 中之類別的應用程式，因為這樣的部署已觸犯 Java 2 Runtime |Environment 二位元碼軟體授權。 |

    -Xcheck:jni

      執行 JNI 函數的額外檢查。

    -Xcheck:nabounds

      執行 JNI 陣列運算的額外檢查。

    -Xdebug

      啟用除錯器來啟動 JVM。

    |-Xdisableexplicitgc |

      |將 System.gc() 呼叫變更為無作業 (no-op)。 |

    -Xdisablejavadump

      對於異常程序終止停用 java 傾出機能。當停用 java 傾出時，就會執行系統程序終止傾出。當 java 程式碼內發生問題時， java 傾出很有用。若問題出在系統元件，則使用正常系統傾出可能比較有用。

    |-Xgcpolicy:{optthruput || optavgpause} |

      |指定記憶體收集設定。預設值是 optthruput。如需詳細資訊，請參閱指定記憶體收集原則。 |

    -Xms<大小>

      設定 Java 起始資料堆大小。

    -Xmx<大小>

      設定 Java 最大資料堆大小。

    -Xnoclassgc

      停用類別記憶體收集。

    -Xoss<大小>

      設定任何執行緒的 Java 最大堆疊大小。

    -Xquickstart

      |增進應用程式的啟動時間。若您未指定此選項， |則以高度最佳化來完成方法的起始編譯 |(亦即，JIT 不重新編譯 "常用" 方法，因為這揰方法已使用高度最佳化進行編譯)。

    -Xrs

      減少使用作業系統信號。

    -Xrunlibrary_name[:options]

      載入說明程式庫。若要載入多重程式庫，請在指令行上指定多次。 這些程式庫的範例如下：
      - -Xrunhprof[:help] | [:<選項>=<值>, ...]
          執行資料堆、CPU 或監視器設定。.
      - -Xrunjdwp[:help] | [:<選項>=<值>, ...]
          載入除錯程式庫來支援應用程式遠端除錯。

    -Xss<大小>

      設定任何執行緒的最大原生堆疊大小。如需詳細資訊，請參閱使用浮點堆疊。

    |-Xverbosegclog:<檔案路徑><檔案名稱>[X, Y] |

      |令 verboseGC 輸出寫入指定的檔案。若檔案存在，則予以改寫。 |否則，若無法開啟現有的檔案或無法建立新檔案，則輸出會重新導向 stderr。 |若您指定引數 X 和 Y (二者皆為整數)，則 verboseGC 輸出會重新導向為 Y 個檔案， |其中每一個檔案皆包含 verbose GC 輸出的 X 個 gc 循環。這些檔案的格式為 filename1、 |filename2，依此類推。
      |註:
        本版次已移除環境變數 IBM_JVM_ST_VERBOSEGC_LOG。 |
      |

    -Xverify

      啟用嚴格的檢查，考慮未來的預設值。

  ## java 指令的全球化

  java 指令及其他 java 啟動程式指令 (例如 javaw) 允許用現行語言環境字集中的任何 Unicode 字元來指定類別名稱。

  您可以在類別名稱和引數中使用 java 跳脫字元來指定任何 Unicode 字元。 但必須先指定 -Xargencoding。若要指定 Unicode 字元，請以 `\u####` 格式來使用跳脫字元，其中 # 是十六進位數字 (0 至 9，A 至 F)。

  若要指定類別名稱和指令引數是 UTF8 或 ISO8859_1 編碼， 請使用 -Xargencoding:utf8 和 -Xargencoding:latin。

  在 Runtime Environment 中，若您使用非英文的語言環境，java 和 javaw 指令會提供經過翻譯的輸出訊息。 這些訊息不同於 1.3.1 版中的訊息，也會視 Java 執行所在語言環境而有所不同。 java 傳回的詳細錯誤說明和其他除錯資訊是英文。 起始設定期間傳回的除錯資訊會顯示在方括弧中。

  ## 使用類別路徑

  在 Runtime Environment 中，您可以指定類別名稱為完整的檔案名稱，包含完整路徑和 .class 副檔名。 在舊版的 SDK 中，您只能指定相對於 CLASSPATH 的類別，且不容許 .class 副檔名。使用完整的檔案名稱可讓您從桌面或檔案啟動程式來啟動 Java 應用程式。 若您指定的 .class 檔案包含路徑和副檔名，則指定的路徑會放入 CLASSPATH 中。例如， 指令 `java c:\myapp\thisapp.class` 相當於指定 `java -classpath c:\myapp thisapp`。

  ## |JVM 如何處理信號

  |當發生 JVM 所要處理的信號時，就會呼叫信號處理程式。 |此信號處理程式會針對 Java 或非 Java 執行緒來進行呼叫。 |如果信號是要發送到 Java 執行緒，則 JVM 會接手信號處理。 |如果信號是要發送到非 Java 執行緒，且安裝 JVM 的應用程式先前已安裝自己的信號處理程式， |則控制權會移轉給此處理程式。否則，系統會忽略信號 |(不論這是否為信號的預設動作)。

  |對於異常狀況和錯誤信號，JVM 的動作如下：

  - |處理狀況並回復 (若是由您的應用程式碼造成異常狀況)， |或
  - |進入控制的關機程序，此時它會：
    1. |呼叫您的應用程式信號處理程式來處理此信號
    2. |輸出 Java 記憶體傾印，說明失敗時的 JVM 狀態
    3. |呼叫任何應用程式安裝的終止 hook
    4. |執行必要的清除作業來徹底關機 |
    |

  |對於岔斷信號，JVM 也會進入控制的關機程序， |但這一次視為正常終止，此時它會：

  - |呼叫您的應用程式信號處理程式來處理此信號
  - |執行所有應用程式關機 hook
  - |呼叫任何應用程式安裝的結束 hook
  - |執行必要的 JVM 清除 |

  |此關機作業和呼叫 Java |方法 `System.exit()` 所起始的關機作業完全相同。

  |JVM 所使用的其他信號係供內部控制使用，不會導致它終止。 |唯一相關的控制信號是 SIGQUIT， |其會產生 Java 記憶體傾印。

  ### |JVM 使用的信號

  |下列表 1顯示 JVM 使用的信號。 |表格中的信號依類型或用途分類如下：

  - |異常狀況：每當發生嚴重的狀況時，作業系統就同步發出適當的異常狀況信號。
  - |錯誤：JVM 在偵測到無法回復的狀況時，就發出 SIGABRT。
  - |岔斷：以非同步方式從 JVM 程序外部發出非同步岔斷信號來要求關機。
  - |控制：由 JVM 作為控制用途的其他信號。 |
  |

  |表 1. JVM 使用的信號

  信號名稱 | 信號類型 | 說明 | 透過 -Xrs 來停用
  --- | --- | --- | ---
  SIGSEGV | 異常狀況 | 不正確存取記憶體 (寫入無法存取的記憶體) | 否
  SIGILL | 異常狀況 | 不合法指令 (嘗試呼叫不明的機器指令) | 否
  SIGFPE | 異常狀況 | 浮點數異常狀況 (除以零) | 否
  SIGBUS | 異常狀況 | 匯流排錯誤 (嘗試定址不存在的記憶體位置) | 是
  SIGSYS | 異常狀況 | 發出不正確的系統呼叫 | 是
  SIGXCPU | 異常狀況 | 已超出 CPU 時間限制 (執行時間太長) | 是
  SIGXFSZ | 異常狀況 | 已超出檔案大小限制 | 是
  SIGABRT | 錯誤 | 異常終止。JVM 每偵測到 JVM 錯誤時就發出此信號。 | 是
  SIGINT | 岔斷 | 互動式注意 (CTRL-C)。JVM 正常結束。 | 是
  SIGTERM | 岔斷 | 終止要求。JVM 將正常結束。 | 是
  SIGHUP | 岔斷 | 關機。JVM 正常結束。 | 是
  SIGUSR1 | 控制 | 使用者定義。由部份 JVM 作為內部控制用途。 | 否
  SIGUSR2 | 控制 | 使用者定義。由部份 JVM 作為內部控制用途。 | 否
  SIGQUIT | 控制 | 終端機的退出信號。JVM 使用此信號來執行 Java 記憶體傾印。 | 是
  SIGTRAP | 控制 | 由 dbx 或 ptrace 作為內部使用。由部份 JVM 作為內部控制用途。 | 是
  SIGPIPE | 控制 | 寫入管道，尚未讀取。JVM 忽略此信號。 | 否

  |請使用 -Xrs (減少使用信號) 選項來防止 |JVM 使用太多信號。如需詳細資訊，請參閱 Sun 的 Java 應用程式啟動程式網頁， |網址是： http://java.sun.com/j2se/1.4.1/docs/tooldocs/windows/java.html。

  |信號 `1 (SIGHUP)`、`2 (SIGINT)`、`4 (SIGILL)`、`6 (SIGABRT)`、`7 (SIGEMT)`、`8 (SIGFPE)`、`10 (SIGBUS)`、`11 (SIGSEGV)`、`12 (SIGSYS)`、`15 (SIGTERM)`、及 `24 (SIGXCPU)` 會導致 JVM 關機； |因此，應用程式信號處理程式不應該嘗試從這些信號回復，除非不再需要 JVM 的服務。

  ### |鏈結原生的程式碼驅動程式與信號鏈結程式庫

  |IBM 31 位元 Runtime Environment for Linux on zSeries，Java 2 Technology Edition 1.4.1 版 JVM 包含一個新的信號鏈結機能。信號鏈結可讓 |JVM 信號鏈結可讓 |JVM 與已安裝自己的信號處理程式的原生程式碼的交互作業變得更有效率。

  |信號鏈結機能可讓應用程式在 libc/libthread/libpthread 之前先鏈結和載入共用的程式庫 |libjsig.so。jsig.dll 程式庫可以確保一定截取到 |`signal()`、`sigset()` 及 `sigaction()` 等呼叫，不讓它們的處理程式取代 JVM 的信號處理程式。 |這些呼叫會改成儲存新的信號處理程式，或在 JVM 已安裝的處理程式後「鏈結」起來。 |稍後，一旦發出這些信號且發現不是針對 JVM 所發出的，則呼叫預先安裝的處理程式。

  |若要使用 libjsig.so：

  - |將它與建立或內嵌 JVM 的應用程式鏈結起來：

        |gcc -L <directory of libjvm.so> -ljsig -ljvm java_application.c

    |或

  - |使用 LD_PRELOAD 環境變數：

        |export LD_PRELOAD=<libjsig.so dir>/libjsig.so; java_application (ksh)
        |
        |setenv LD_PRELOAD <libjsig.so dir>/libjsig.so; java_application (csh)

    |

  |若您安裝的信號處理程式用到 `sigaction()`，則 JVM 使用該信號時不會注意到某些 sa_flags。 |包括：

  - |SA_NOCLDSTOP - 一律不設定。
  - |SA_NOCLDWAIT - 一律不設定。
  - |SA_RESTART - 一律設定。
  - |SA_ONSTACK - 一律設定 (僅限 SIGSEGV)。 |

  |libjsig.so 程式庫也會隱藏 JVM 信號處理程式，讓應用程式察覺不到。 |因此，在 JVM 啟動之後執行的 `signal()`、`sigset()` 及 `sigaction()` 等呼叫不再傳回 JVM 信號處理程式的參照， |而改以傳回 JVM 啟動之前已安裝的任何處理程式。

  ## 使用 bootclasspath

  您可以利用 啟動 Java 應用程式 中說明的 -D 選項，來設定系統內容 ibm.jvm.bootclasspath。 這個內容的值會用來作為額外的搜尋路徑，該路徑會插入 -Xbootclasspath/p: 所定義的任何值與 bootstrap 類別路徑之間。 bootstrap 類別路徑是預設值，或是使用 -Xbootclasspath: 選項所定義的值。

  ## 指定記憶體收集原則

  -Xgcpolicy JVM Runtime 選項可指定記憶體收集原則。

  -Xgcpolicy 使用兩個值：optthruput (預設值) 和 optavgpause。 此選項會控制記憶體回收器行為，在應用程式和整體系統的處理量與因記憶體收集所造成的暫停時間之間找出平衡點。

  選項及其值的格式為：

  > -Xgcpolicy:optthruput

  和

  > -Xgcpolicy:optavgpause

  ### 暫停時間

  當資料堆的可用空間無法立即滿足應用程式建立物件的嘗試時，記憶體回收器就負責識別未被參照的物件 (記憶體)、刪除這些物件， 以及讓資料堆回到可快速滿足立即與後續配置要求的一種狀態。 這種記憶體收集循環偶而會造成應用程式碼執行時意外地暫停。 因為應用程式的大小和複雜性會增加，且資料堆也相對地變大， 造成此記憶體收集的暫停時間愈來愈久也更明顯。 預設的記憶體收集值 optthruput 可傳遞很高的處理量給應用程式， 但犧牲的就是這些偶而的暫停現象，從暫停幾毫秒到幾秒鐘都有可能， 視資料堆和記憶體數量而定。

  ### 減少暫停時間

  optavgpause 選項除了限制資料堆大小遞增對記憶體收集暫停時間長度的影響， 還可以大量地減少這些記憶體收集暫停的時間。 此選項對於有大量資料堆的配置尤其重要。 暫停時間之所以可減少是因為系統會在正常程式執行的同時亦執行部份記憶體收集活動。 但隨著暫停時間減少，您可能會發現應用程式處理量也會跟著減少，程度視應用程式而有所不同。

  ### 資料堆填滿的環境

  若 Java 資料堆接近飽合，且只收回非常少的記憶體， 則可能無法立即滿足新物件的呼叫要求，因為沒有立即可用的空間。 若資料堆在接近飽合容量的情況下操作， 不論是否使用上述選項，應用程式效能可能還是會降低； 而且，若持續要求更多資料堆空間，應用程式會收到 OutofMemory 異常狀況，萬一未能掌握並處理異常狀況，則將導致 JVM 終止。 在這些狀況下，建議您使用 -Xmx 選項來增加資料堆大小，或減少使用中的應用程式物件數量。

  ### 關於記憶體收集的進一步資訊

  如需記憶體收集的詳細資訊，請參閱：

  http://www.ibm.com/developerworks/ibm/library/i-garbage1/

  http://www.ibm.com/developerworks/ibm/library/i-garbage2/

  http://www.ibm.com/developerworks/ibm/library/i-garbage3/

  |如需在 Java 應用程式中處理記憶體漏失的相關資訊，請參閱：http://www.ibm.com/developerworks/library/j-leaks/index.html。

  # 取得 IBM 建置和版本號碼

  若要取得 IBM 建置和版本號碼，請在 Shell 提示下輸入：

  `java -version`

  # 使用浮點堆疊

  在沒有浮點堆疊的 Linux 系統上，不管 -Xss 的設定為何，系統一律針對每一個執行緒提供 256 KB 的最小原始堆疊大小。 在浮點堆疊 Linux 系統上，-Xss 值會生效。 因此，若您是從沒有浮點堆疊的 Linux 系統移轉， 則必須確定任何 -Xss 值都夠大， 並且不要依賴 256 KB 這個最小值。

  # 在雙位元組字集語言中切換輸入法

  在雙位元組字集 (DBCS) 系統上，若您要切換輸入法， 您應該使用 java.util.prefs.Preferences 類別，而非 IBMJAVA_INPUTMETHOD_SWITCHKEY 和 IBMJAVA_INPUTMETHOD_SWITCHKEY_MODIFIERS 環境變數。詳細資訊，請參閱 Sun 的輸入法組織架構規格。

  # Runtime 範例

  Sun 網站 http://java.sun.com 上有一個 "Hello World" 範例供您下載。此範例示範如何建立可在 Runtime Environment 上執行的簡單 Java 應用程式。

  # 在使用者的系統上安裝您的應用程式

  在開發完成您的產品並且準備出貨時，您需要在使用者的系統上安裝您的產品、 配置使用者的系統來支援您的軟體，以及配置 Runtime 環境。

  若您使用 Runtime Environment for Linux，則必須確定您的安裝程序不會改寫現有的安裝環境 (除非現有的 Runtime Environment for Linux 是較舊版本)。

  若要重新分送 Runtime Environment for Linux，您可以在自己的系統上先安裝好， 然後再將必要的 Runtime Environment 檔案複製到您的安裝集。 若您選擇這種方式，則必須併入 Runtime Environment for Linux 提供的所有檔案。 唯有併入所有檔案，才能夠重新分送 Runtime Environment for Linux 軟體。 事實上，當您的應用程式出貨時，它已有自己的 Runtime Environment for Linux 副本。

  關於必須重新分送之檔案的特定資訊，請參閱本產品隨附的授權合約。

  # 已知限制

  下列各節說明 SDK for Linux 的已知限制。

  - |若您執行時夾帶著許多並行執行緒， |您可能會遇到警告訊息：`java.lang.OutOfMemoryError`。 |這表示您的機器發生系統資源不足的問題，而訊息可能是由下列原因造成：

    |

    1. |無法建立新的執行緒，因為： |
       - |建立的程序數量已超出您的使用者限制。
         |

         |

       - |無足夠的系統資源可用來建立新的執行緒。在此情況下， |您可能會看到其他 Java 異常狀況，視您執行的應用程式而定。 |
       |

       |

    2. |核心記憶體不足或被切成片段。您可以在 /var/log/messages 中看到對應的 |「記憶體不足」核心訊息，且都有已刪除的程序 ID。
       |

       |

    請嘗試調整您的系統來增加對應的系統資源。
    |
  - 在安裝期間，如果您已安裝由 Red Hat 分送之本產品的舊版本，Red Hat Package Manager (RPM) 會報告 IBM 套裝軟體比 Red Hat 分送之產品的任何版本都來得舊。 會發生這種狀況的原因是，Red Hat 將「序號」加入 RPM 套件中，這會改寫套件中產品的版本化架構， 而依預設， RPM 會拒絕安裝比已安裝的版本還要舊的套件。 rpm 指令的 --oldpackage 選項可讓您安裝新的 IBM 套件。

  - 若您在沒有音效卡的機器上播放音效，您可能會遇到錯誤訊息，指出當 Java 嘗試播放聲音時記憶體不足。 訊息會顯示在主控台中，但不影響您的 Java 應用程式。

  - 若您執行 K Desktop Environment (KDE)，則可能無法使用系統剪貼簿在 Linux 應用程式和 Java 應用程式之間複製雙位元組字集 (DBCS) 的資訊。

  - SDK 將 Java 執行緒當做原生的執行緒來實作，造成每一個執行緒都成為個別的 Linux 程序。 若 Java 執行緒的數量超出允許的最大程序數目，您的程式可能會收到錯誤訊息、 SIGSEGV 錯誤，甚至整個系統當機。

    可用的最大執行緒數目視下列何者最小而定：

    - /etc/security/limits.conf 中的使用者程序設定 (ulimit -u)
    - |/proc/sys/kernel/threads_max 中定義的限制
    - libpthreads.so 中定義的限制 PTHREAD_THREADS_MAX (變更之後需要重新編譯 Linux Kernel)

    不過，在達到最大執行緒數之前，虛擬儲存體可能會不足。

  - 若您使用 Ctrl-C 終止 Java 應用程式， 有些程序會變的零散沒有組織。

  - 在介面上執行的 javap 程式會在結果中重覆 "interface" 這個字串。 例如，在 "java.lang.Runnable" 上執行 javap 會產生：

        public interface interface java.lang.Runnable extends java.lang.Object...

  - 如果您嘗試顯示以 Swing 建立的對話框，可能會延遲幾秒鐘後，這些方框才會顯示在視窗中。

  - 在 Linux 中使用不同的視窗管理程式時，含有 ALT 鍵的按鍵事件會有不同的結果。 也會不同於其他作業系統的結果。 在 Enlightenment 視窗管理程式中，Alt+A 和 Shift+Alt+A 會產生不同的修飾元， 而 Ctrl+Alt+A 則完全不會產生任何按鍵事件。不過， 若使用 WindowMaker 視窗管理程式，則 Ctrl+Alt+A 會產生一個按鍵事件。

  - 在 Linux X Window System 上，按鍵對映設為：64 0xffe9 (Alt_L) 0xffe7 (Meta_L)，以及 113 0xffea (Alt_R) 0xffe8 (Meta_R)。您可以在 Shell 提示上鍵入下列指令來測試一下：

        xmodmap -pk

    這就是為何 SDK 將 Meta + Alt 視為同時按下的理由。解決之道是在 Shell 提示上鍵入下列指令來移除 Meta_x 對映：

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

    註:
      若相同顯示器上有其他 X-Window 應用程式正在執行，且用到已移除的 Meta 鍵， 則此解決方案可能會影響到這些應用程式。

  - 在較慢的機器上建立很長的 DSA 鍵配對會有明顯的時間延遲。 請勿以當機的方式來中斷這個延遲現象，因為只要您容許足夠的時間， 程序就會完成。DSA 鍵產生演算法經過最佳化，可以最快速地產生標準的鍵長度 (例如 512、1024)。

  - |已移除 v1.4.0 中大部份的 NIO (新的 I/O) 限制。 |僅保留下列限制：
    |

    |表 2. 新的 I/O 限制

    Sun 臭蟲號碼 | 簡短的限制說明
    --- | ---
    4696508 | 選擇器未如指定地同步化

    |

  - 原生的程式無法建立 1.1 JVM。不可能呼叫 JNI_CreateJavaVM() 並傳遞 JNI_VERSION_1_1(0x00010001) 的版本。可傳遞的版本如下：
    - JNI_VERSION_1_2(0x00010002)
    - JNI_VERSION_1_4(0x00010004)

    |每一個情況中建立的 JVM 是由程式庫來指定 |(亦即，1.2.2、1.3.x、1.4.x)，並非由 JNI 介面所隱含指定。 |介面 API 不影響 JVM 實作的語言規格、類別庫 API 或其他任何區域的 JVM 行為。 |介面 API 僅指定原生的程式碼如何呼叫必要的行為。

  - 雖然現行發行版中的 Linux Kernel 支援 Internet Protocol 版本 6 (IP6)，但您使用時可能會有問題。 這個版本包含來自 Java 的 IP6 支援， 但建議您在 Java 指令上使用 -Djava.net.preferIPv4Stack=true 選項來關閉這項支援。若您安裝的核心充分支援 IP6，則不需要此選項。

  下列限制僅發生在繁體中文的使用者。

  - 當使用 LinYi ZhuYin、YiTian ZhuYin 及 Bosham IME 來輸入 TCH 字元時， 功能鍵 Enter、Space、Backspace 及 ESC 未如預期般地運作。 Enter 鍵用來輸入新行、ESC 鍵用來取消預先編輯的字串或候選的視窗， Space 鍵可以插入空格。 當您使用 LinYi ZhuYin、YiTian ZhuYin 及 Bosham IME 來輸入繁體中文字元時， 按下確定鍵之後，候選的視窗應該消失，且按下 Backspace 鍵時不應該再出現。

  # 注意事項

  本資訊乃是針對在美國提供的產品及服務而撰寫。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

  下列段落若與該國之法律條款抵觸，即視為不適用：

  IBM 僅以現狀提供本書，而不提供任何明示或默示之保證（包括但 不限於可商用性或符合特定效用的保證）。有些地區在某些固定的交易上並不接受明示或默示保證的放棄聲明，因此此項 聲明不見得適用於您。

  本資訊中可能會有技術上或排版印刷上的訛誤。因此，IBM 會定期修訂； 並將修訂後的內容納入新版中。同時，IBM 得隨時改進及（或）變動本資訊中所 提及的產品及（或）程式。

  本資訊中任何對非 IBM 網站的敘述僅供參考，IBM 對該網站並不提供保證。該網站上的資料，並非本 IBM 產品所用資料的一部分，如因使用該網站 而造成損害，其責任由 貴客戶自行負責。

  IBM 得以各種適當的方式使用或散佈由 貴客戶提供的任何資訊，而無需對您負責。

  本程式之獲授權者若希望取得相關資料， 以便使用下列資訊者可洽詢 IBM。其下列資訊指的是： (1) 獨立建立的程式與其他程式（包括此程式）之間更換資訊的方式； (2) 相互使用已交換之資訊方法。 若有任何問題請聯絡：

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

  上述資料得遵循適當條款而取得，在某些情況下必須付費方得使用。

  IBM 基於雙方之「IBM 客戶合約」、「國際程式授權合約」或任何同等合約之條款，提供本文件中所述之授權程式與其所有適用的授權資料。

  任何此處涵蓋的執行效能資料都是在一個受控制的環境下決定出來的。因此，若在其他作業環境下，所得的結果可能會大大不同。有些測定已在開發階段系統上做過， 不過這並不保證在一般系統上會出現相同結果。再者，有些測定可能已透過推測方式評估過。但實際結果可能並非如此。本書的使用者應依自己的特定環境，查證適用的資料。

  本書所提及之非 IBM 產品資訊，係一由產品的供應商，或其出版的聲明或其他公開管道取得。IBM 並未測試過這些產品，也無法確認這些非 IBM 產品的執行效能、相容性或任何對產品的其他主張是否完全無誤。如果您對非 IBM 產品的性能有任何的疑問，請逕向該產品的供應商查詢。

  ## 商標

  IBM 和 zSeries 是 International Business Machines Corporation 在美國和（或）其他國家或地區的商標或註冊商標。

  Java 以及所有以 Java 為基礎的商標及標誌圖都是 Sun Microsystems, Inc. 在美國和（或）其他國家或地區的商標或註冊商標。

  其他公司、產品或服務名稱，可能是第三者的商標或服務標誌。

  本產品包含由 Apache Software Foundation http://www.apache.org/ 所開發之軟體。