2017-06-16 6 views
0

私の場合、Java側のsavePngImage()は、libpngライブラリを使用するJNIのネイティブnativeSavePngImage()を呼び出す静的関数です。JNIから呼び出されるDLLは、Mallocなどの割り当て用のメモリをどこから得ますか

FYIでは、関数はプログラム内の複数のスレッドによってアクセスされ、アプリケーションは何十万もの画像を漸進的に保存しています。画像の数が十万に達すると、png_create_write_struct()は失敗の結果NULLを返します。メモリを割り当てます。 javaのメモリ設定は-Xms24G -Xmx24G -Xmn20Gであり、エラーが発生した時点で物理メモリの使用量は128GBの30%にすぎません。

私は非常に間違っているかもしれませんが、実際にタスクマネージャに表示されているメモリが増加傾向を示していないので、ネイティブコードのメモリリークは問題のようです。

// create the png structures 
png_structp pWriteStruct = png_create_write_struct(PNG_LIBPNG_VER_STRING, 
                (png_voidp)NULL, 
                pngErrorFunction, 
                pngErrorFunction); 

if (pWriteStruct == NULL) 
{ 
    fclose(pFile); 
    sptAssert(false); //getting assertion here 
    return; 
} 

どのように我々はJNIでネイティブメモリが限界に当たっているかどうかを知ることができますしたがって、私の質問は、このようにpng_create_write_struct()はメモリを割り当てることができませんされています。

上記の情報が原因を特定するのに役立たず、より多くのデバッグ情報をユーザーの提案から得ることができれば、投稿を更新するのは本当に申し訳ありません。

答えて

1

malloc()は、Cヒープからメモリを戻し、プロセス全体のCヒープまたはDLL自身のヒープであるかどうかは、DLLとプロセスが同じダイナミックCライブラリを共有しているかどうかによって異なります。

JNIとJavaヒープは、どちらの場合もまったく関係ありません。

残りの質問は先頭にあります。 png_create_write_struct()は、NULLを返すときにメモリが不足していることがわかります。

+0

私は、メモリ割り当てがdll独自のヒープであるのか、プロセス全体のヒープにあるのかを確認できますか? – vincent911001

+0

DLLがどのように構築されているか分からない限りはありません。しかし、あなたは知る必要はありません。 – EJP

関連する問題