2017-06-16 24 views
0

在我的情況中,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()無法分配內存。

如果目前的上述信息無法幫助確定原因,並且會更新帖子,如果可以從您的玩家建議中獲得更多調試信息,我真的很抱歉。

回答

1

malloc()從C堆中返回內存,以及這是整個進程的C堆還是DLL自己的堆取決於DLL和進程是否共享相同的動態C庫。

在這兩種情況下,JNI和Java堆都與它完全無關。

你的問題的其餘部分是回到前面。當它返回NULL時,您知道png_create_write_struct()內存不足

+0

我可以知道我們如何檢查內存分配是在dll自己的堆還是整個進程c堆? – vincent911001

+0

除非你知道DLL是如何構建的。但你不需要知道。 – EJP