プライマリ・コンテンツに移動
Java Platform, Standard Editionトラブルシューティング・ガイド
リリース10
E94990-01
目次へ移動
目次

前
次

9 クライアントの問題の概要

この章では、様々なJava SE Desktopテクノロジ間の相互作用について説明します。この章ではさらに、問題のトラブルシューティングの開始場所となるテクノロジをユーザーが特定するための手助けをし、一般的なトラブルシューティング・ヒントも提供します。

この章の構成は、次のとおりです。

Java SE Desktopテクノロジ

Java SE Desktopは、リッチ・クライアント・アプリケーションおよびアプレットの作成に使用するいくつかのテクノロジで構成されています。

図9-1に示すように、デスクトップ・ツールおよびライブラリは、Javaアプリケーションとプラットフォーム上のコア・ツールおよびライブラリとの間のインタフェースを提供します。

図9-1 Java SE Desktopの概要

図9-1の説明が続きます
「図9-1 Java SE Desktopの概要」の説明

Java SEで使用可能なデスクトップ・テクノロジの詳細は、Java SE Desktopの概要ドキュメントを参照してください。

このトピックでは、次のJava SE Desktopテクノロジのトラブルシューティング手法について説明します。

  • Abstract Window Toolkit (AWT)は、メニュー、ボタン、テキスト・フィールド、ダイアログ・ボックス、チェックボックスなどのグラフィカル・ユーザー・インタフェース(GUI)コンポーネントを構築し、それらのコンポーネントからのユーザー入力を処理するための一連のアプリケーション・プログラミング・インタフェース(API)を提供しています。また、AWTを使用すると、楕円や多角形などの簡単な図形をレンダリングしたり、アプリケーションで使用するインタフェースのレイアウトやフォントを開発者が制御したりすることもできます。さらに、ネイティブ・プラットフォームのクリップボードを介したカット・アンド・ペーストを可能にするデータ転送クラス(ドラッグ・アンド・ドロップを含む)も含まれています。

    このAPIのクラスはソフトウェア・スタックの最下部(ベースとなるオペレーティング・システムやデスクトップ・システムにもっとも近い位置)にあります。

    AWTは一連の重量コンポーネントも提供します。

    純粋なAWTアプリケーションは通常、Swingに関係しません。AWTアプリケーションでカスタム・レンダリングを行う場合は、Java 2Dが使用されます。

  • Java 2Dは、2次元の高度なグラフィックスとイメージングを処理する一連のクラスです。ライン・アート、テキスト、およびイメージが、1つの総合モデルの中に含まれています。このAPIは、イメージの合成とアルファ・チャンネル・イメージ、正確な色空間の定義と変換用のクラス・セット、および表示用イメージング演算子の豊富なセットを幅広くサポートします。java.awtおよびjava.awt.imageパッケージに追加した形で提供されます。

    AWTと同様に、Java 2Dもソフトウェア・スタックの最下部(ベースとなるオペレーティング・システムやデスクトップ・システムにもっとも近い位置)にあります。

  • Swingは、商用品質のデスクトップおよびインターネット/イントラネット・アプリケーションの開発を可能にする包括的な一連のGUIコンポーネントおよびサービスを提供します。

    Swingは、他の多くのJava SE Desktopテクノロジ(AWT、Java2D、および国際化など)の上部に構築されています。ほとんどの場合、AWTのコンポーネントではなくSwingの上位レベル・コンポーネントの使用が推奨されます。ただし、AWTには、Swingでのプログラミング時に理解しておくことが重要なAPIが多数含まれています。

    Swingは軽量ツールキットなので、ネイティブ・プラット・フォームとの対話処理はほとんどありません。SwingはレンダリングにJava 2Dを使用し、AWTがWindow、Frame、Dialogなどのトップレベル・コンポーネントの作成および操作機能を提供します。

  • 国際化とは、簡単でコスト効率よく、とりわけソフトウェアの技術的な変更をせずに、ソフトウェアを様々な言語および地域に適合(ローカライズ)できるようにするためのソフトウェア設計プロセスのことです。ローカライズを行うには、翻訳されたテキスト、ロケール固有の動作を記述するデータ、フォント、入力方式など、ロケール固有のコンポーネントを追加するだけです。

    Java SEでは、言語や文化に依存する機能を提供するクラスやパッケージに国際化サポートが完全に組み込まれています。

    Java SEの国際化APIおよび機能の詳細は、国際化のドキュメントを参照してください。

  • Java Soundは、拡張可能かつ柔軟なフレームワークにおける、オーディオの再生や取込み(録音)、ミキシング、MIDI(Musical Instrument Digital Interface)シーケンス、MIDI合成といったオーディオ操作の下位レベルのサポートを提供します。このAPIは、このプラットフォームでの高品質なオーディオ・ミキシングおよびMIDI合成を保証する効果的なサウンド・エンジンによってサポートされています。

  • Java Plug-inは、一般的なWebブラウザをJavaプラットフォームに接続することで、それらのブラウザの機能を拡張します。この接続により、Webサイト上のJavaアプレットをデスクトップ上のWebブラウザ内で実行できます。

これらのテクノロジ間の関係の理解が深まるほど、問題が属する分野をすばやく特定できるようになります。

一般的な問題のトラブルシューティング手順

アプリケーションの問題をトラブルシューティングするための一般的な手順。

アプリケーションの実行中に問題が発生した場合は、次の手順に従って問題をトラブルシューティングします。

  1. 症状の特定:
  2. 本質的でない問題の排除:
    • 正しいパッチ、ドライバ、およびオペレーティング・システムがインストールされていることを確認します。

    • 以前のリリースを試します(バックトレース)。

    • テストを最小限にします。一度にテストする問題の数をできるだけ制限します。

    • ハードウェアおよびソフトウェアの構成を最小化します。単一システムや複数システム上で問題を再現できるかを確認します。ブラウザのバージョンによって問題が変化するかを確認します。

    • VMが複数インストールされているかどうかに問題が依存するかを確認します。

  3. 原因の調査:
    • その分野での典型的な原因をチェックします。

    • フラグを使ってデフォルトを変更します。

    • トレースを使用します。

    • 例外的な場合には、システム・プロパティを使ってペイント・システムの動作を一時的に変更します。

  4. 修正する:
    • 可能性のある回避方法を見つけます。

    • バグを提出します。

      バグ・レポートの提出方法に関する指針や、レポートで収集する必要があるデータに関する提案については、「バグ・レポートの提出」を参照してください。

    • 設定を修正します。

    • アプリケーションを修正します。

問題のタイプの特定

発生ている問題を識別し、原因と解決策を見いだすための指針。

まず、少し時間をかけて、発生している問題を分類します。そうすれば、問題の特定分野の識別、原因の発見、および最終的な解決方法や回避方法の決定が容易になります。

次の各項では、よくあるタイプの問題について説明します。

これらの中には明確でないものもありますが、すべての可能性を検討することや問題でない要素を除外することは、常に役立ちます。

Javaクライアントのクラッシュ

Javaクライアントがクラッシュすると、致命的エラーの発生時に取得された情報と状態を含むエラー・ログが作成されます。

エラー・ログ・ファイルのデフォルト名はhs_err_pid.logです。ここで、pidはクラッシュしたプロセスのプロセス識別子(PID)です。このファイルは、スタンドアロンJavaアプリケーションの場合は現在のディレクトリに作成され、Javaアプレットの場合はブラウザ・バイナリ・ディレクトリまたはユーザー・クライアント・フォルダに作成されます。

致命的エラー・ログの詳細は、「致命的エラー・ログ」を参照してください。

ヘッダー・セクションの先頭付近の行には、エラーが発生したライブラリが示されます。次の例では、クラッシュがAWTライブラリに関係していたことがわかります。

...
# Java VM: Java HotSpot(TM) Client VM (1.6.0-beta2-b76 mixed mode, sharing)
# Problematic frame:
# C  [awt.dll+0x123456]
...

クラッシュがJava Native Interface (JNI)で発生した場合、その原因はおそらくデスクトップ・ライブラリです。ネイティブ・ライブラリでのクラッシュは通常、Java 2DまたはAWTでの問題を意味しますが、それは、Swingにはネイティブ・コードがあまり含まれていないからです。Swingに含まれる少量のネイティブ・コードはネイティブ・ルック・アンド・フィールに関するものなので、アプリケーションでネイティブ・ルック・アンド・フィールが使用されている場合はこの分野に関するクラッシュである可能性があります。

エラー・ログでは通常、クラッシュが発生した具体的なライブラリが示されるため、この情報から原因を推測できます。Java Development Kit (JDK)の一部でないライブラリでのクラッシュは通常、環境の問題(不正なビデオ・ドライバやデスクトップ・マネージャなど)を示しています。

パフォーマンスの問題

パフォーマンスの問題は、得られる情報が一般にあまり多くないため、診断が難しくなります。

まず、どのテクノロジで問題が発生しているかを判断する必要があります。たとえば、レンダリング・パフォーマンスの問題はおそらくJava 2Dの中にあり、応答性の問題はSwingに関連します。

パフォーマンス関連の問題は、次のカテゴリに分けられます。

  • 起動

    アプリケーションが起動してユーザーが使える状態になるまで、どれくらいの時間がかかりますか。

  • フットプリント

    アプリケーションのメモリー使用量はどれくらいですか。これは、Windowsのタスク・マネージャ、またはOracle SolarisおよびLinuxオペレーティング・システムのtopprstatのようなツールで測定できます。

  • 実行時

    アプリケーションが実行するよう設計されているタスクを完了する速度はどのくらいですか。たとえば、アプリケーションで何かを計算する場合、その計算が終了するまでに要する時間はどのくらいですか。ゲームの場合、フレーム・レートが許容されていますか、またアニメーションはスムーズに動いていますか。

    注意: これは、次のトピックの応答性と同じではありません。

  • 応答性

    アプリケーションがユーザーとの対話に応答する速度はどれくらいですか。ユーザーがメニューをクリックした場合、メニューが表示されるまでどれくらいの時間がかかりますか。実行時間の長いタスクに割り込むことはできますか。アプリケーションの再ペイント速度は、アプリケーションの動作が遅く見えない程度に高速ですか。

動作の問題

アプリケーションの様々な問題に対処するための指針。

クラッシュのほかに、動作に関係するさまざまな問題が発生する可能性があります。これらの問題のいくつかを次に示します。それらの問題の説明を通じて、トラブルシューティングを行うためのJava SE Desktopテクノロジについても説明していきます。

  • ハングアップは、アプリケーションがユーザー入力への応答をやめたときに発生します。「プロセスのハングおよびループのトラブルシューティング」を参照してください。

  • Javaコードの例外は、目に見える形でコンソールやアプリケーション・ログ・ファイルにスローされます。この出力を調べれば問題の分野がわかります。

  • レンダリングおよび再ペイントの問題は、Java 2DまたはSwingに問題があるためです。たとえば、あるアプリケーションの外観が、そのアプリケーション上に別のアプリケーションをドラッグしたことによって発生した再ペイント後におかしくなることがあります。その他の例として、不適切なフォント、間違ったカラー、スクロール、あるアプリケーションのフレーム上に別のウィンドウをドラッグしたことによってアプリケーションのフレームが破損する問題、破損した領域の更新、などが挙げられます。

    簡単なテスト方法を次に示します。問題が別のプラットフォーム上で再現可能な場合(たとえば、最初にWindows上で確認された問題がOracle SolarisやLinux上でも存在する場合)、それはSwingのPaintManagerの問題である可能性が非常に高くなります。

    Java 2Dのレンダリング・パイプラインをいくつかのフラグで変更する方法については、「Java 2D」を参照してください。これは、問題がJava 2D、Swingのどちらに関係しているかを判断する際にも役立つ可能性があります。

    マルチ画面に関する再ペイント問題(ある画面から別の画面にウィンドウを移動した際の再ペイントの問題や、デフォルト以外の画面デバイスとの対話処理に起因するその他の異常な動作など)は、Java 2Dに属します。

  • デスクトップの対話処理に関連する問題は、AWTでの問題を示します。そのような問題のいくつかの例は、ウィンドウの移動、サイズ変更、最小化および最大化、フォーカスの処理、複数の画面の列挙、モーダリティの使用、通知領域(システム・トレイ)との対話処理、およびスプラッシュ画面の表示の際に発生します。

  • ドラッグ・アンド・ドロップの問題はAWTに関連しています。

  • 出力の問題は、使用しているAPIに応じて、Java 2DまたはAWTのどちらかに関連している可能性があります。

  • AWTアプリケーションでのテキスト・レンダリングの問題は、おそらくフォント・プロパティまたは国際化の問題です。

    ただし、アプリケーションでAWTのみが使用されている場合、テキスト・レンダリングの問題はJava 2Dに起因している可能性もあります。Oracle SolarisまたはLinuxの場合、テキスト・レンダリングはJava 2Dによって実行されます。

    Swingのテキスト・レンダリングはJava 2Dによって実行されます。したがって、Swingを使用したアプリケーションでテキスト・レンダリングの問題(グリフの欠落、グリフの不正なレンダリング、行間や文字間の間隔の異常、フォントの低品質なレンダリングなど)が発生する場合、その問題はおそらくJava 2Dに属します。

  • ペイントの問題は、Swingの問題である可能性がもっとも高くなります。

  • フルスクリーンの問題は、Java 2D APIに関連しています。

  • エンコーディングやロケールの問題(ロケール固有の文字が表示されないなど)は、国際化の問題を示します。

基本ツール

特定のタイプの問題のトラブルシューティングの助けになる可能性がある基本ツールのリスト。

この項では、特定タイプの問題のトラブルシューティングに役立つ可能性のある、いくつかのツールの一覧を示します。

  • パフォーマンス: ベンチマーク、プロファイラ、DTrace、Javaプローブ。

  • フットプリント: jmap、プロファイラ

  • クラッシュ: ネイティブ・デバッガ

  • ハング: JConsole、jstack、[Ctrl]+[Break]

  • フォント・レンダリング: Font2DTest (JDKのdemo/jfc/Font2DTestに含まれている)

Java Debug Wire Protocol

Java Debug Wire Protocol(JDWP)は、アプリケーションやアプレットのデバッグに非常に役立ちます。

JDWPを使用してアプリケーションをデバッグするには、次の手順に従います。
  1. コマンド行を開き、PATH環境変数をjdk/binに設定します。ここで、jdkはJDKのインストール・ディレクトリです。
  2. 次のコマンドを使用して、デバッグするアプリケーション(この例ではTestという名前)を実行します。
    • Windowsの場合:
      java -Xdebug -Xrunjdwp:transport=dt_shmem,address=debug,server=y,suspend=y Test
      
    • Oracle SolarisおよびLinuxオペレーティング・システムの場合:
      java -Xdebug -Xrunjdwp:transport=dt_socket,address=8888,server=y,suspend=y Test
      

    Testクラスがデバッグ・モードで起動し、アドレスdebug (Windowsの場合)または8888 (Oracle SolarisおよびLinuxオペレーティング・システムの場合)でデバッガの接続を待機します。

  3. コマンド行を新たに開き、次のコマンドを使用してjdbを実行し、実行中のデバッグ・サーバーに接続します。
    • Windowsの場合:
      jdb -attach 'debug'
      
    • Oracle SolarisおよびLinuxオペレーティング・システムの場合:
      jdb -attach 8888
      
    jdbが初期化され、Testに接続されると、Javaレベルのデバッグを実行できます。
  4. ブレークポイントを設定して、アプリケーションを実行します。たとえば、Testmainメソッドの先頭にブレークポイントを設定するには、次のコマンドを実行します。
    stop in Test.main run
    

    jdbユーティリティがそのブレークポイントに達すると、アプリケーションが実行されている環境を調べて、予想どおりに機能しているかどうかを確認できます。

  5. (オプション) Javaレベルのデバッグとともにネイティブ・レベルのデバッグも実行するには、JDWPで実行中のJavaプロセスにネイティブ・デバッガを使って接続します。
    • Oracle Solarisではdbxユーティリティを、Linuxではgdbユーティリティをそれぞれ使用できます。
    • Windowsでは、次のように、ネイティブ・レベルのデバッグにVisual Studioを使用できます。
      1. Visual Studioを開きます。

      2. 「デバッグ」メニューで、「プロセスにアタッチ」を選択します。JDWPで実行中のJavaプロセスを選択します。

      3. 「プロジェクト」メニューで、「設定」を選択して、「デバッグ」タブを開きます。「カテゴリ」ドロップダウン・リストで、「追加のDLL」を選択し、デバッグするネイティブDLLを追加します(例: Test.dll)。

      4. Test.dllのソース・ファイル(1つ以上)を開き、ブレークポイントを設定します。

      5. jdbウィンドウでcontと入力します。プロセスがVisual Studioのブレークポイントに達します。

JDWPを使用してアプレットをデバッグするには、次の手順に従います。

  1. Javaコントロール・パネルを起動し、「Java」タブを開いて、「表示」をクリックします。「Java Runtime Environment設定」ウィンドウで、必要なプラットフォームの「ランタイム・パラメータ」フィールドに次を指定します。

    • Windowsの場合:

      Djavaplugin.trace=true -Xdebug -Xrunjdwp:transport=dt_shmem,address=debug,server=y,suspend=y
      
    • Oracle SolarisおよびLinuxオペレーティング・システムの場合:

      Djavaplugin.trace=true -Xdebug -Xrunjdwp:transport=dt_shmem,address=8888,server=y,suspend=y
      

    Webブラウザを起動してアプレットをロードすると、Java Plug-inがデバッグ・モードで起動し、アドレスdebug (Windowsの場合)または8888 (Oracle SolarisおよびLinuxオペレーティング・システムの場合)でデバッガの接続を待機します。

  2. コマンド行を開き、次のコマンドを使用してjdbを実行し、実行中のデバッグ・サーバーに接続します。

    • Windowsの場合:

      jdb -attach 'debug'
      
    • Oracle SolarisおよびLinuxオペレーティング・システムの場合:

      jdb -attach 8888
      

    jdbが初期化され、Testに接続されると、Javaレベルのデバッグを実行できます。

  3. ブレークポイントを設定して、アプレットを実行します。たとえば、MyAppletfunc1メソッドの先頭にブレークポイントを設定するには、次のコマンドを実行します。

    stop in MyApplet.func1 run
    

    jdbユーティリティがそのブレークポイントに達すると、アプリケーションが実行されている環境を調べて、予想どおりに機能しているかどうかを確認できます。