私は自分の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-1、Source-2とSource-3)非決定論的であることを知っています。
doSomeStuffのSystem.gc()が実行されると、&がフリーズすることがありますか?
その後、メイン実行のSystem.gc()&は、同じobjを解放してクラッシュしますか?これが本当に当てはまる場合は、それを証明する方法はありますか(gcによってfree'edされたオブジェクトの順序を示すためにログ/プリントしますか?)
このSOポスト、explains causes of SIGABRT
私はリリースモードで実行していますので、私のC++のlib doesntのはどのアサート/を中止しています。したがって、私は、対象の倍数/倍数自由度を考慮しています。
いいえ、 'System.gc()'は唯一の勧告である(JVMは何かをするかもしれないし、無視するかもしれない)。 –
いいえ、オブジェクトは一度だけリリースされ、 'System.gc()'は一度も解放しない可能性があるためです。 – EJP
こんにちは@ElliottFrischとEJP、応答に感謝します。私のアプリで** SIGABRT **を引き起こす可能性のあるものを提案できますか?既に言及したように、私のC++ libは** assert/abort **を持っていて、メインのfuncではSystem.gc()**への呼び出しを1回しか持たないので、問題を解決するようです。 –