私の場合、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()
はメモリを割り当てることができませんされています。
上記の情報が原因を特定するのに役立たず、より多くのデバッグ情報をユーザーの提案から得ることができれば、投稿を更新するのは本当に申し訳ありません。
私は、メモリ割り当てがdll独自のヒープであるのか、プロセス全体のヒープにあるのかを確認できますか? – vincent911001
DLLがどのように構築されているか分からない限りはありません。しかし、あなたは知る必要はありません。 – EJP