9 クライアントの問題の概要
この章の構成は、次のとおりです。
Java SE Desktopテクノロジ
Java SE Desktopは、リッチ・クライアント・アプリケーションの作成に使用するいくつかのテクノロジで構成されています。
図9-1に示すように、デスクトップ・ツールおよびライブラリは、Javaアプリケーションとプラットフォーム上のコア・ツールおよびライブラリとの間のインタフェースを提供します。
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クライアントのクラッシュ
Javaクライアントがクラッシュすると、致命的エラーの発生時に取得された情報と状態を含むエラー・ログが作成されます。
エラー・ログ・ファイルのデフォルト名はhs_err_pid.logです。ここで、pidはクラッシュしたプロセスのプロセス識別子(PID)です。スタンドアロンの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のタスク・マネージャ、またはLinuxオペレーティング・システムの
top
やprstat
のようなツールで測定できます。 -
実行時
アプリケーションが実行するよう設計されているタスクを完了する速度はどのくらいですか。たとえば、アプリケーションで何かを計算する場合、その計算が終了するまでに要する時間はどのくらいですか。ゲームの場合、フレーム・レートが許容されていますか、またアニメーションはスムーズに動いていますか。
ノート: これは、次のトピックの応答性と同じではありません。
-
応答性
アプリケーションがユーザーとの対話に応答する速度はどれくらいですか。ユーザーがメニューをクリックした場合、メニューが表示されるまでどれくらいの時間がかかりますか。実行時間の長いタスクに割り込むことはできますか。アプリケーションの再ペイント速度は、アプリケーションの動作が遅く見えない程度に高速ですか。
動作の問題
アプリケーションの様々な問題に対処するための指針。
クラッシュのほかに、動作に関係するさまざまな問題が発生する可能性があります。これらの問題のいくつかを次に示します。それらの問題の説明を通じて、トラブルシューティングを行うためのJava SE Desktopテクノロジについても説明していきます。
-
ハングアップは、アプリケーションがユーザー入力への応答をやめたときに発生します。「プロセスのハングおよびループのトラブルシューティング」を参照してください。
-
Javaコードの例外は、目に見える形でコンソールやアプリケーション・ログ・ファイルにスローされます。この出力を調べれば問題の分野がわかります。
-
レンダリングおよび再ペイントの問題は、Java 2DまたはSwingに問題があるためです。たとえば、あるアプリケーションの外観が、そのアプリケーション上に別のアプリケーションをドラッグしたことによって発生した再ペイント後におかしくなることがあります。その他の例として、不適切なフォント、間違ったカラー、スクロール、あるアプリケーションのフレーム上に別のウィンドウをドラッグしたことによってアプリケーションのフレームが破損する問題、破損した領域の更新、などが挙げられます。
簡単なテスト方法を次に示します。問題が別のプラットフォーム上で再現可能な場合(たとえば、最初にWindows上で確認された問題がLinux上でも存在する場合)、それはSwingの
PaintManager
の問題である可能性が非常に高くなります。Java 2Dのレンダリング・パイプラインをいくつかのフラグで変更する方法については、「Java 2D」を参照してください。これは、問題がJava 2D、Swingのどちらに関係しているかを判断する際にも役立つ可能性があります。
マルチ画面に関する再ペイント問題(ある画面から別の画面にウィンドウを移動した際の再ペイントの問題や、デフォルト以外の画面デバイスとの対話処理に起因するその他の異常な動作など)は、Java 2Dに属します。
-
デスクトップの対話処理に関連する問題は、AWTでの問題を示します。そのような問題のいくつかの例は、ウィンドウの移動、サイズ変更、最小化および最大化、フォーカスの処理、複数の画面の列挙、モーダリティの使用、通知領域(システム・トレイ)との対話処理、およびスプラッシュ画面の表示の際に発生します。
-
ドラッグ・アンド・ドロップの問題はAWTに関連しています。
-
出力の問題は、使用しているAPIに応じて、Java 2DまたはAWTのどちらかに関連している可能性があります。
-
AWTアプリケーションでのテキスト・レンダリングの問題は、おそらくフォント・プロパティまたは国際化の問題です。
ただし、アプリケーションでAWTのみが使用されている場合、テキスト・レンダリングの問題はJava 2Dに起因している可能性もあります。Linuxの場合、テキスト・レンダリングはJava 2Dによって実行されます。
Swingのテキスト・レンダリングはJava 2Dによって実行されます。したがって、Swingを使用したアプリケーションでテキスト・レンダリングの問題(グリフの欠落、グリフの不正なレンダリング、行間や文字間の間隔の異常、フォントの低品質なレンダリングなど)が発生する場合、その問題はおそらくJava 2Dに属します。
-
ペイントの問題は、Swingの問題である可能性がもっとも高くなります。
-
フルスクリーンの問題は、Java 2D APIに関連しています。
-
エンコーディングやロケールの問題(ロケール固有の文字が表示されないなど)は、国際化の問題を示します。
基本ツール
特定のタイプの問題のトラブルシューティングの助けになる可能性がある基本ツールのリスト。
この項では、特定タイプの問題のトラブルシューティングに役立つ可能性のある、いくつかのツールの一覧を示します。
-
パフォーマンス: ベンチマーク、プロファイラ、DTrace、Javaプローブ。
-
フットプリント:
jmap
、プロファイラ -
クラッシュ: ネイティブ・デバッガ
-
ハング: JConsole、
jstack
、[Ctrl]+[Break] -
フォント・レンダリング: Font2DTest (
demo/jfc/Font2DTest
ディレクトリ内のJDK 8デモおよびサンプル・バンドルに含まれている)