- - PR -
JCOM + Excelで JVMダウン
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-09-02 21:30
Javaから jcomを使って、Excelのマクロを実行させています。
その際に、稀にJVMがダウンしてしまうことがあります。 何か原因が分かりますでしょうか? 怪しい点としては、Javaがマルチスレッドで動作しており、 同時にjcomを呼び出している可能性があります。 このような事は不可でしょうか? 以下にトレースを載せます。 よろしくお願い致します。 -------------------------------------------------------------------------------- An unexpected exception has been detected in native code outside the VM. Unexpected Signal : EXCEPTION_ACCESS_VIOLATION (0xc0000005) occurred at PC=0x38D 802F Function=Java_jp_ne_so_1net_ga2_no_1ji_jcom_Com_StringFromIID+0x3CA3 Library=C:WINDOWS\system32\jcom.dll Current Java thread: at jp.ne.so_net.ga2.no_ji.jcom.IDispatch._create(Native Method) at jp.ne.so_net.ga2.no_ji.jcom.IDispatch.create(IDispatch.java:84) - locked <0x115a5228> (a jp.ne.so_net.ga2.no_ji.jcom.excel8.ExcelApplica tion) at jp.ne.so_net.ga2.no_ji.jcom.IDispatch.<init>(IDispatch.java:46) at jp.ne.so_net.ga2.no_ji.jcom.excel8.ExcelApplication.<init>(ExcelAppli cation.java:'8') at jp.co.xxx.yyy.zzz.mmm.execute(mmm.java:315) at java.lang.Thread.run(Unknown Source) -------------------------------------------------------------------------------- jp.co.xxx.yyy.zzz.mmm.execute(mmm.java:315) の内容の抜粋 ------------------------------------------------ xxx:ReleaseManager rm = new ReleaseManager(); xxx:ExcelApplication excel = null; 315: excel = new ExcelApplication(rm); ← ここを最後にJVMダウン ------------------------------------------------ 環境: Windows 2003 server Excel2003 Java 1.4.2_08 jcom224 ?? [ メッセージ編集済み 編集者: ボブ 編集日時 2008-09-02 21:33 ] | ||||||||
|
投稿日時: 2008-09-02 23:20
"An unexpected exception has been detected in native code outside the VM. "と書いてあるとおり、VMの外で、ネイティブコード内で例外が発生していますね。
#会社名っぽいのがスタックトレースに出ていますが大丈夫ですか? マルチスレッドで動作している場合だけ発生するのであればライブラリのドキュメントをご覧になってスレッドセーフなのかどうか確認してみてはいかがでしょうか。 マルチスレッドで動くことと落ちることの因果関係が明らかでない場合は負荷試験を行って再現テストを行うと良いですね。 [ メッセージ編集済み 編集者: インギ 編集日時 2008-09-02 23:23 ] | ||||||||
|
投稿日時: 2008-09-02 23:56
JCom作者のa-sanです。
Excelはマルチスレッドに対応していないので、 複数スレッドから同時にアクセスしてはダメです。 1つずつ呼ぶような仕組みにしてください。 so-netはJComを作ったころのプロバイダですw。 | ||||||||
|
投稿日時: 2008-09-03 00:56
そうですね、念のため 複数同時にExcelApplicationオブジェクトを 作らせるようなチョンプロ作って、再現出来るか試したいと思います。
本人の登場ありがとうございます! きっと来てくれると信じてました、ソースコードみたら同じ苗字でしたしw やはりここは synchronized 等で1スレッドずつ処理をしましょうということですね。 ほとんどの場合は、毎日3〜7スレッドほど同時に動作させてもエラーとならずに済んでいたので、大丈夫かと思っていました。しかし、3ヶ月に1回くらいは、前述のようなトレースを刷いてダウンしてましたので、調査・質問させて頂いた次第です。 | ||||||||
|
投稿日時: 2008-10-30 11:58
本現象、
シングルプロセッサーと、マルチプロセッサーで違いがあるようです。 Javaのマルチスレッドで複数Excelプロセスを作成しても、シングルプロセッサーでは、 このようなエラーは起きず、マルチプロセッサーだと起きました。 おそらく、シングルプロセッサーでは、Javaのマルチスレッドで動作しても、CPUから見て、同時に処理できるスレッドは1個のみですので、Excelにアクセスするのは1個で起きず、 マルチプロセッサーでは、CPUから見て2つのスレッドを同時処理出来、同時にExcelにアクセスしてしまうので起きてしまうと思われます。 この推測はどうでしょうか? | ||||||||
|
投稿日時: 2008-10-30 21:44
うーむ、なんとも言えないですねぇ〜。
シングルプロセッサーでも、切り替わるタイミングが悪ければ、不整合を起こしてダウンするでしょう。もしシングルプロセッサーとマルチプロセッサーで動作が変わるなら、ExcelやJComの問題ではなく、OSのプロセス管理の問題ということになってしまうのでは??? やはり、私がお薦めできるのはプロセッサ数に関係なく「一度に複数のアクセスを行わないこと」です。 | ||||||||
|
投稿日時: 2008-11-05 11:04
やはり、シングル/マルチに関わらず、常にExcelプロセスは1つにすることが良いようですね。ありがとうございました。 |
1