ヘッダーをスキップ
Oracle Containers for J2EE構成および管理ガイド
10g(10.1.3.5.0)
B56030-01
  目次
目次
索引
索引

戻る
戻る
次へ
次へ
 

A OC4Jのトラブルシューティング

この付録では、OC4Jの使用時に発生する可能性のある一般的な問題と、それらの解決策について説明します。次の項目が含まれます。

問題と解決策

この項では、一般的な問題とその解決策について説明します。この項の内容は次のとおりです。

最大同時タイマーに関する警告

問題

同時タイマーの数が最大値を超えると、次の例のような警告が表示されます。

WARNING J2EE OJR-10002

The number of concurrent Timers has reached the maximum limit

OC4J 10g(10.1.3.5.0)では、デフォルトで許可されている同時タイマーは8つのみです。(タイマーは、EJBタイマー、タイマー・サービスまたはスケジューラによって起動されます。)この制限は、各タイマーが短期のものであると予測されているため、デフォルトでは低い数値になっています。タイマーの数が制限値であるとき、タイマーがなんらかの理由で長く稼働している場合、タイマーはそれ以上実行されません。新しいタイマーが発生すると、OC4Jにより警告メッセージが表示されます。

解決策

この問題を回避するには、次に示す2つのOC4Jシステム・プロパティのいずれかを使用します。

  • timer.service.debug

    このプロパティは、現在実行中のタイマー数に関する情報など、タイマー・サービスの追加の診断情報を記録するかどうかを決定します。次に例を示します。

    -Dtimer.service.debug=true
    
  • executor.concurrent.tasks

    このプロパティは、エグゼキュータ・サービスの同時タスク数を指定します。このプロパティを使用して、OC4Jで許可されている同時タイマーの最大数を増加できます。次に例を示します。

    -Dexecutor.concurrent.tasks=12
    

注意:

各タイマーは、個別のスレッドで実行されます。タイマーの最大数を高く設定しすぎると、多数のタイマーが実行され、OC4Jで多くのスレッドが使用されることになります。実行が終了したら、スレッドを再利用することをお薦めします。

システム・プロパティの設定の詳細は、第4章「OC4Jランタイムの構成」を参照してください。

java.lang.OutOfMemoryエラー

問題

「メモリー不足」エラーは、Javaインスタンスのヒープ・サイズがOC4J内で稼働しているアプリケーションで必要なメモリーより少なくなっていることを意味します。

解決策

次のように、OC4Jの起動時にOC4Jプロセスのヒープ・サイズを必要な量のメモリーにまで増やします。

java -Xms512m -Xmx512m -jar oc4j.jar

アプリケーションがOPMN管理の環境で稼働している場合は、これらのJVM設定はopmn.xml構成ファイルの<data id="java-options">要素内に定義します。次に例を示します。

<ias-component id="default_group">
  <process-type id="home" module-id="OC4J" status="enabled">
    <module-data>
      <category id="start-parameters">
        <data id="java-options" value="-Xms512m -Xmx512m -Djava.awt.headless=true
          -Dhttp.webdir.enable=false"/>
        ...
      </category>
      ...
    </module-data>
  </process-type>
</ias-component>

アプリケーションがLinuxまたはUNIX環境で稼働している場合は、ulimit設定でJVMプロセスによるこの量のメモリーの割当てが可能になっていることを確認します。

アプリケーションのパフォーマンスがガベージ・コレクションの一時停止の影響を受ける

問題

OC4Jで稼働するアプリケーションが無応答になり、単純なリクエストに著しい遅延を示します。これは、JVMがメモリー不足のしきい値を超え、メモリーを解放しようとフル・ガベージ・コレクションを実行していることが原因です。

解決策

停止時間の短いインクリメンタル・コレクタの使用を検討してください。これは、メジャー・コレクションの一部をマイナー・コレクションごとに行い、メジャー・ガベージ・コレクションによる長い停止を回避します。このコレクタ(トレイン・コレクタとも呼ばれる)では、マイナー・コレクションごとに、古い世代(通常1回のメジャー・コレクションで収集されるオブジェクトを保持するメモリー・プール)の一部を収集します。その結果、より短い停止時間が多数のマイナー・コレクションに分散することになります。

全体的なスループットを考えると、インクリメンタル・コレクタはデフォルトの古い世代のコレクタより遅くなります。

インクリメンタル・コレクタを使用するには、アプリケーションの起動時にJavaコマンドラインで-Xincgcオプションを渡す必要があります。XX:NewSizeおよび-XX:MaxNewSizeオプションを使用して、若い世代(オブジェクト・プール)の初期サイズと最大サイズを同じ値に設定します。-Xmsおよび-Xmxオプションを使用して、Javaの初期ヒープ・サイズと最大ヒープ・サイズを同じ値に設定します。

たとえば、1GBの物理メモリーを保持するサーバーでこのコレクタを使用するには、次のように設定します。

java -server -Xincgc -XX:NewSize=64m -XX:MaxNewSize=64m -Xms512m -Xmx512m

ガベージ・コレクションのチューニングの詳細は、http://java.sun.com/docs/hotspot/gc1.4.2/で入手できる『Tuning Garbage Collection with the 1.4.2 Java Virtual Machine』を参照してください。

無効または不要なライブラリ要素によるパフォーマンスの低下

問題

OC4Jプロセス・メモリーがプログラムの実行中に一貫して増加する場合、グローバルなapplication.xmlファイルの無効なシンボリック・リンクに対する参照があることが考えられます。一般に、この問題は、Javaオブジェクト・メモリーではなくCヒープが増加するという特徴があり、従来のJavaオブジェクト・メモリー・リークとともに見られます。OC4Jは、application.xmlファイルのリンクを使用して、すべてのリソースをロードします。これらのリンクが無効の場合、Cヒープは増加し続け、OC4Jはメモリー不足となります。

解決策

すべてのシンボリック・リンクが有効であることを確認し、OC4Jを再起動します。

さらに、OC4Jでロード対象として構成されるJARファイル数を最小限に抑えます。使用されていないすべてのJARファイルを、構成と、OC4Jで検索対象として構成されるディレクトリから削除します。OC4Jでは、すべてのJARファイルでクラスとリソースを検索するため、ファイル・キャッシュで余分なメモリーとプロセッサ時間が使用される原因となります。

ClassCastExceptionsおよびClassNotFoundエラー

問題

ほとんどのクラス・ロード・エラーは、クラスの可視性(過剰または不十分)に関連しています。複数のJARにパッケージされたクラス間、あるいは親アプリケーションからデフォルトで継承されたクラス間の衝突が問題になることがあります。

解決策

『Oracle Containers for J2EE開発者ガイド』の第3章「OC4Jクラス・ロード・フレームワークの利用」では、クラス・ロードに関連する問題の回避およびトラブルシューティングについて詳しく説明しています。また、これらの問題の多くを回避するために、OC4J内で共有ライブラリを使用する方法についても説明しています。

OC4Jが起動できない: Javaコンパイラを検出できない

問題

次のようなエラーがOC4Jの起動時に表示されます。

05/10/28 13:58:49 Error initializing server: Error initializing ejb-modules:
Error generating wrappers for file:/C:/oc4j/j2ee/home/applications/admin_ejb.jar:
javac.exe not found under <directory>, please use a valid jdk or specify the
location of your java compiler in server.xml using the <java-compiler .../> tag

解決策

このエラーは、OC4Jが必要なJDKを検出できないことを意味します。この問題を解決するには、コマンドラインでjavac.exeがある場所からOC4Jを起動します。これにより、JDKの場所が設定されます。

次に例を示します。

C:\ORACLE_HOME\j2ee\home\C:\jdk\bin\java -jar oc4j.jar

アプリケーションのクラスタリング時にエラーが発生する

問題

アプリケーションに対してクラスタリングを構成する際に、次のエラーがスローされます。

WARNING: The service implementation <classname> does not implement
java.io.Serializable. *This class is not suitable for clustered environments*
indicated by recoverable=true.

解決策

このエラーは、シリアライズ可能なクラスではないため、OC4Jレプリケーション・フレームワークをこのクラスで利用できないことを意味します。

JDK 5.0からJDK 1.4.2へのダウングレード時にエラーが発生する

問題

Oracle Application ServerのコンポーネントとしてインストールされたOPMN管理のOC4Jインスタンスは、デフォルトではJDKリリース5.0を使用しますが、JDKリリース1.4.2を使用するように構成する際に次のエラーが発生します。

oracle.oc4j.loader.util.AnnotatedLinkageError:
MBeanServerEjbHome_StatefulSessionHomeWrapper1 (Unsupported major.minor
version 49.0)

解決策

Oracle Application ServerのコンポーネントとしてインストールされたOPMN管理のOC4Jインスタンスは、デフォルトではJDKリリース5.0を使用します。この新しいバージョンのJDKはEJB 3.0を使用するために必要で、パフォーマンスが非常に改善されます。しかし、OC4JにデプロイされるアプリケーションにJDKリリース1.4.2が必要な場合は、旧バージョンへのダウングレードが必要になることもあります。

JDK 5.0からJDK 1.4.2に切り替えるには、すべてのコンパイル済アプリケーション・ファイルをOC4Jインスタンスから削除する必要があります。

  1. OC4Jインスタンスを停止します。

  2. ORACLE_HOME/j2ee/instance/application-deploymentsディレクトリを削除します。

    このディレクトリを削除すると、OC4JがJDK 1.4.2で再起動される際に、アプリケーション・ファイルは再コンパイルされます。

opmn.xml構成ファイルを手動で編集して、各OC4Jインスタンスに使用するJDKを指定できます。JDKとともにインストールされた、JAVA_HOME環境変数に定義されているjavacコンパイラを使用する場合は、server.xmlから<java-compiler>要素も削除し、OC4Jがデフォルト設定を再検出できるようにします。

JMX MBeanServerおよびMBeanServerConnectionインタフェースでサポートされていないメソッド

問題

JMX MBeanServerインタフェースには、次の操作で取得したMBeanServerオブジェクトが使用されている場合には、J2EEアプリケーションで使用できないメソッドが多数あります。

MBeanServer mbsrv = MBeanServerFactory.newMBeanServer();

戻されたMBeanServerオブジェクトに次に示すメソッドを使用すると、UnsupportedOperationException例外がスローされます。

public final ClassLoader getClassLoaderFor(ObjectName mbeanName)

public final ClassLoader getClassLoader(ObjectName loaderName)

public final ClassLoaderRepository getClassLoaderRepository()

public final Object instantiate(String className)

public final Object instantiate(String className, ObjectName loaderName)

public final Object instantiate(String className, Object[] params, String[] signature)

public final Object instantiate(String className, ObjectName loaderName, Object[] params, String[] signature)

public final ObjectInstance createMBean(String className, ObjectName name)

public final ObjectInstance createMBean(String className, ObjectName name, ObjectName loaderName)

public final ObjectInstance createMBean(String className, ObjectName name, 
Object[] params, String[] signature)

public final ObjectInstance createMBean(String className, ObjectName name, 
ObjectName loader, Object[] params, String[] signature)

public final ObjectInputStream deserialize(ObjectName name, byte[] data)

public final ObjectInputStream deserialize(String className, byte[] data)

public final ObjectInputStream deserialize(String className, ObjectName loaderName, byte[] data)

アプリケーションでOracle JMXコネクタが使用されている場合、MBeanServerConnectionインタフェースの多くのメソッドを使用できません。作成されたMBeanServerConnectionオブジェクトに次に示すメソッドを使用すると、UnsupportedOperationException例外がスローされます。

public final ObjectInstance createMBean(String className, ObjectName name)

public final ObjectInstance createMBean(String className, ObjectName name, ObjectName loaderName)

public final ObjectInstance createMBean(String className, ObjectName name, Object[] params, String[] signature)

public final ObjectInstance createMBean(String className, ObjectName name, ObjectName loader, 
Object[] params, String[] signature)

解決策

アプリケーションでJMX MBeanServerまたはMBeanServerConnectionインタフェースが使用されている場合は、アプリケーションでサポートされていないメソッドを使用しないでください。

Oracle Application Serverでアプリケーションを起動する際にOC4Jがハングする

問題

OPMN管理の環境では、OC4Jを起動しようとするとOPMNがハングし、その結果次のようなエラーが発生します。

ias-component/process-type/process-set:
    default_group/home/default_group/

   Error
   Process (index=1,uid=2012873812,pid=2988)
   time out while waiting for a managed process to start

解決策

かなりの量のリソースを必要とするアプリケーション(様々なコンポーネントに対して複数のデータベース接続を取得しようとするアプリケーションなど)が原因で、OC4Jが起動できない場合があります。これは、opmn.xmlでOC4Jインスタンスに対して定義される<start-timeout>要素に、アプリケーションを起動できる最大時間を指定することにより管理できます。この値に達すると、アプリケーションは起動されません。この値は、インスタンスにデプロイされたすべてのアプリケーションに適用されます。

次の例では、home OC4Jインスタンスにデプロイされたアプリケーションに対するタイムアウトの値を800秒に増やしています。

<ias-component id="default_group">
  ...
  <process-type id="home" module-id="OC4J" status="enabled">
    ...
    <start timeout="800" retry="2"/>
  </process-type>
</ias-component>

その他のヘルプ

その他の解決策は、Oracleの次のサポート用Webサイトで検索できます。

それでも問題の解決策が見つからない場合は、サービス・リクエストに記録してください。