在我的情況中,java端的savePngImage()
是一個靜態函數,它在使用libpng
庫的JNI中調用本地nativeSavePngImage()
。從JNI調用的DLL獲取內存分配的位置,例如Malloc
僅供參考,該功能被程序中的多個線程訪問,並且該應用程序逐步保存了數十萬個圖像,並且在圖像計數達到了10萬的一個點上,png_create_write_struct()
由於未能分配內存。 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自己的堆還是整個進程c堆? – vincent911001
除非你知道DLL是如何構建的。但你不需要知道。 – EJP