まず、少し時間をかけて、発生している問題を分類します。そうすれば、問題の特定分野の識別、原因の発見、および最終的な解決方法や回避方法の決定が容易になります。
次の各サブセクションでは、よくあるタイプの問題について説明します。
これらの中には明確でないものもありますが、すべての可能性を検討することや問題でない要素を除外することは、常に役立ちます。
クラッシュが発生すると、致命的エラーの発生時に取得された情報や状態を含むエラー・ログが作成されます。エラー・ログ・ファイルのデフォルト名はhs_err_pid.logです。ここで、pidはクラッシュしたプロセスのプロセス識別子(PID)です。このファイルは、スタンドアロンJavaアプリケーションの場合は現在のディレクトリに作成され、Javaアプレットの場合はブラウザ・バイナリ・ディレクトリまたはユーザー・クライアント・フォルダに作成されます。
致命的エラー・ログの詳細は、付録Aを参照してください。
ヘッダー・セクションの先頭付近の行には、エラーが発生したライブラリが示されます。例9-1は、クラッシュが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オペレーティング・システムのtop
やprstat
のようなツールで測定できます。
ランタイム
アプリケーションが実行するよう設計されているタスクを完了する速度はどのくらいですか。たとえば、アプリケーションで何かを計算する場合、その計算が終了するまでに要する時間はどのくらいですか。ゲームの場合、フレーム・レートが許容されていますか、またアニメーションはスムーズに動いていますか。
注意: これは、次のトピックの応答性と同じではありません。
応答性
アプリケーションがユーザーとの対話に応答する速度はどれくらいですか。ユーザーがメニューをクリックした場合、メニューが表示されるまでどれくらいの時間がかかりますか。実行時間の長いタスクに割り込むことはできますか。アプリケーションの再ペイント速度は、アプリケーションの動作が遅く見えない程度に高速ですか。
クラッシュのほかに、動作に関係するさまざまな問題が発生する可能性があります。これらの問題のいくつかを次に示します。それらの問題の説明を通じて、トラブルシューティングを行うための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に関連しています。
エンコーディングやロケールの問題(ロケール固有の文字が表示されないなど)は、国際化の問題を示します。