Oracle Containers for J2EE構成および管理ガイド 10g(10.1.3.1.0) B31849-01 |
|
この付録では、OC4Jの使用時に発生する可能性のある一般的な問題と、それらの解決策について説明します。この付録の内容は次のとおりです。
この項では、一般的な問題とその解決策について説明します。この項の内容は次のとおりです。
「メモリー不足」エラーは、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>
アプリケーションがUNIXまたはLinuxシステムで稼働している場合は、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ファイルでクラスとリソースを検索するため、ファイル・キャッシュで余分なメモリーとプロセッサ時間が使用される原因となります。
ほとんどのクラス・ロード・エラーは、クラスの可視性(過剰または不十分)に関連しています。複数のJARにパッケージされたクラス間、あるいは親アプリケーションからデフォルトで継承されたクラス間の衝突が問題になることがあります。
『Oracle Containers for J2EE開発者ガイド』の第3章「OC4Jクラス・ロード・フレームワークの利用」では、クラス・ロードに関連する問題の回避およびトラブルシューティングについて詳しく説明しています。また、これらの問題の多くを回避するために、OC4J内で共有ライブラリを使用する方法についても説明しています。
次のようなエラーが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レプリケーション・フレームワークをこのクラスで利用できないことを意味します。
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インスタンスから削除する必要があります。
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インタフェースには、次の操作で取得した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インタフェースが使用されている場合は、アプリケーションでサポートされていないメソッドを使用しないでください。
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サイトで検索できます。
http://www.oracle.com/technology/documentation/index.html
)で入手できるOracle Application Serverのリリース・ノート
http://metalink.oracle.com
)
それでも問題の解決策が見つからない場合は、オラクル社カスタマ・サポート・センターに問い合せてください。
|
Copyright © 2006 Oracle Corporation. All Rights Reserved. |
|