このページで解決しない高度なJavaのシステム障害はJaTSにお任せください

Trouble 12: JNIに関する問題



<Q12-1>PIPEを使用してプロセスの起動確認/排他起動を行うCのプログラムを、JNIを使用して複数スレッドからCallすると、通常は一つしか起動されないCのプログラムが複数起動してしまいます。


<発生環境>
OS Solaris2.6
JDK JRE1.3
Vender Sun
<A12-1>
JNIを使用するラッピング用クラスのメソッドをCallするクラスを新たに作成し、ラッピング用クラスを更にラッピングする形で、各メソッドを非staticかつsynchronizedに設定することで解決できます。
上記のクラスのインスタンスをmainスレッド上でstaticに生成し、各スレッドがこのstaticに生成されたクラスのメソッドを介してJNIにアクセスしてください。
Page Top

<Q12-2>JNIを使用しているプログラムでVMがcoreダンプしてしまいます。


<発生環境>
OS Solaris
JDK JDK1.3.0
Vender Sun
<A12-2>
以下の原因が考えられます。
  1. CのプログラムとのI/Fでおかしな値が渡されている。
  2. Cのプログラム中にメモリを確保(malloc)して開放(free)せずにプログラム終了した状態でガベージコレクションが動作した。
  3. Cのプログラムでバグが発生している。
  1. の場合、Cプログラムで処理前に値の検査をおこなうことで回避できます。
  2. の場合、JNIを使用している個所にSystem.gc()を入れることで場所を特定することができます。場所を特定し、freeをするようにCプログラムを修正する必要があります。
  3. の場合、Cプログラムのバグを修正する必要があります。
ネイティブコード内部でメモリリークが発生していると、JavaVMがガベージコレクションを実行したときに、異常終了する恐れがあります。 ネイティブコード実行タイミングとガベージコレクション実行タイミングにはズレが生じるため、問題箇所の発見が困難となります。 意図的にSystem.gc()を利用することで、メモリリーク発生箇所の発見を手助けすることができます。
Page Top

<Q12-3>JavaからJNIを使用して呼び出した関数でvfork()を呼び出している場合、プロセスが停止することがあります。


<発生環境>
OS Solaris2.6
JDK JRE1.3
Vender Sun
<A12-3>
Solaris2.6ではマルチスレッドプロセスからvfork()を呼び出すとプロセスが破壊されることがあります。JavaVM自体がマルチスレッドで動作するので、JavaからJNIを使用して呼び出した関数でvfork()を呼び出している場合、プロセスが終了することがあります。trussを使用してvfork()を呼び出していないか調べてください。
Page Top

<Q12-4>CのシグナルハンドラからJavaメソッドを呼ぶとVMがcoreダンプしてしまいます。

【発生条件】

  1. Cの関数でシグナルハンドラを記述する&Javaのメソッドをコールバックできるように、Javaのオブジェクトを記憶しておく。
  2. Javaのコードでは、シグナル待ちの状態でwaitしている。
  3. JavaVMに対して、シグナルを送る。
  4. Cのシグナルハンドラから、Javaのメソッドを呼び出す。*1
  5. 呼ばれたメソッドで、notifyする。
  6. Java側でその他の処理をする。
*1でJavaのメソッドを呼び出すと、呼び出したJavaメソッド内の処理で、JavaVMがcoreダンプする。

<発生環境>
OS Solaris2.8
JDK JDK1.3.0
Vender Sun
<A12-4>
原因は不明ですが、以下の2点を変更することによる回避実績があります。
  1. Cのシグナルハンドラから呼び出される、Javaのメソッドをsynchronizedにするのではなく、JNIを使ってCのシグナルハンドラでsynchronizedブロックを実行する。
  2. Javaコードでnotify()を実行するのではなく、Cの関数でnotifyするようにする。

Page Top
アンケートフォーム

このページに掲載されていた情報は役にたちましたか?

  • とても役に立った
  • 役に立った
  • あまり役にたたなかった
  • 役にたたなかった

注意:本文書の内容に誤りがあり、またこの文書によって不利益を被っても、
Acroquest Technology 株式会社は一切関知いたしません。

  • 現象別Index
  • 原因別Index

Find Bugsバグ詳細

Find Bugs Bug Descriptions日本語版

RSSで更新情報を取得する

RSSとは、ホームページの更新情報を配信する為のフォーマットです。
RSSを利用すると、登録したページの情報が更新された場合に、更新情報を自動的に受け取る事ができます。

詳細

弊社小森が執筆致しました

Javaでオブジェクト指向開発

Javaプログラミング言語習得において、新人プログラマーの最初の障害は「オブジェクト指向の壁」です。
本書は、Javaのソフトウェア開発を中心に事業を発展させてきたAcroquest社の新人教育セミナーを加筆・書籍化したもので、大卒の新人に対して、ゼロからJava言語を教えてきた実績をフィードバックしています。

メールマガジン配信中

Javaトラブルシューティングのメルマガをはじめました!是非ご購読ください

詳細