2016-08-15 6 views
-1

私は自分のC++ライブラリを呼び出すJavaプログラムを持っています。 JNI-C++ブリッジングがSWIG
を使用して作成された私は、の行動を理解しようとしたJava &に比較的新しいですにSystem.gc & は、System.runFinalization
以下このコードは殺し、SIGABRTを引き起こし私のアプリ(10回のうち2)
Java - System.gcを2回呼び出すことで、基になるオブジェクトを2回リリースできますか?

public static void main (String[] args) 
{ 
    try 
    { 
     doSomeStuff(); 
    } catch(Exception ex) 
    { 
     System.out.println(ex.getMessage()); 
    } finally { 
     System.runFinalization(); 
     System.gc(); 
    } 

} 

void doSomeStuff() 
{ 
    try 
    { 
     sampleCppClass cppClass = new sampleCppClass(); 
     /* 
     * do some stuff with Cpp obj 
     */ 
    } catch (Exception ex) 
    { 
     System.out.println(ex.getMessage()); 
    } finally { 
     System.runFinalization(); 
     System.gc(); 
    } 
} 


この1つは

public static void main (String[] args) 
{ 
    try 
    { 
     doSomeStuff(); 
    } catch(Exception ex) 
    { 
     System.out.println(ex.getMessage()); 
    } finally { 
     System.runFinalization(); 
     System.gc(); 
    } 

} 

void doSomeStuff() 
{ 
    try 
    { 
     sampleCppClass cppClass = new sampleCppClass(); 
     /* 
     * do some stuff with Cpp obj 
     */ 
    } catch (Exception ex) 
    { 
     System.out.println(ex.getMessage()); 
    } 
} 


正常に動作に対し、私はにSystem.gc()&は、System.runFinalizationは、()(Source-1Source-2Source-3)非決定論的であることを知っています。
doSomeStuffのSystem.gc()が実行されると、&がフリーズすることがありますか?
その後、メイン実行のSystem.gc()&は、同じobjを解放してクラッシュしますか?これが本当に当てはまる場合は、それを証明する方法はありますか(gcによってfree'edされたオブジェクトの順序を示すためにログ/プリントしますか?)
このSOポスト、explains causes of SIGABRT
私はリリースモードで実行していますので、私のC++のlib doesntのはどのアサート/を中止しています。したがって、私は、対象の倍数/倍数自由度を考慮しています。

+0

いいえ、 'System.gc()'は唯一の勧告である(JVMは何かをするかもしれないし、無視するかもしれない)。 –

+0

いいえ、オブジェクトは一度だけリリースされ、 'System.gc()'は一度も解放しない可能性があるためです。 – EJP

+0

こんにちは@ElliottFrischとEJP、応答に感謝します。私のアプリで** SIGABRT **を引き起こす可能性のあるものを提案できますか?既に言及したように、私のC++ libは** assert/abort **を持っていて、メインのfuncではSystem.gc()**への呼び出しを1回しか持たないので、問題を解決するようです。 –

答えて

1

はとてもdoSomeStuff()System.gc()が実行されることを&自由はOBJです発生する可能性があります。

はい、ただし、何もしないこともあります。

その後、メイン実行&のSystem.gc()は、クラッシュを引き起こす同じobjを解放しようとしますか?

いいえThはガベージコレクションであり、C++破壊ではありません。オブジェクトごとに1回だけ、またはまったく起こりません。

このコードに関する限り、根本的な理由は、gc()runFinalization()の呼び出しが間違った順序で行われていることです。 runFinalization()は、以前のGCがない場合は何もしません。ファイナライザキューを実行します。ファイナライザキューはGCのみによって生成されます。

だから、すべて2回すると、2番目のrunFinalization()だけが何もしません。おそらくネイティブコードにバグがあるように思われるSampleCPPClassのファイナライザを実行します。

しかし、コードを投稿していないので、さらにコメントすることはできません。

関連する問題