Use ‘top’ or ‘cat /proc/PID/status’ to view the system memory,as a result, there are more than 100 percent (8GB) bug.
But if you use ‘free’ or ‘jtop’, you still have a lot of memory left:
It was found that converting nvmm buffers into cpu buffers using cuda interfaces caused this,Is this a memory leak or just a bug in the jetson system statistics process?
{
NvBufSurface *surface = NULL;
NvBufSurfTransformRect src_rect, dst_rect;
surface = (NvBufSurface *) map.data;
int batch_size= surface->batchSize;
src_rect.top = 0;
src_rect.left = 0;
src_rect.width = (guint) surface->surfaceList[0].width;
src_rect.height= (guint) surface->surfaceList[0].height;
dst_rect.top = 0;
dst_rect.left = 0;
dst_rect.width = (guint) surface->surfaceList[0].width;
dst_rect.height= (guint) surface->surfaceList[0].height;
NvBufSurfTransformParams nvbufsurface_params;
nvbufsurface_params.src_rect = &src_rect;
nvbufsurface_params.dst_rect = &dst_rect;
nvbufsurface_params.transform_flag = NVBUFSURF_TRANSFORM_NORMALIZE; //NVBUFSURF_TRANSFORM_CROP_SRC | NVBUFSURF_TRANSFORM_CROP_DST;
nvbufsurface_params.transform_filter = NvBufSurfTransformInter_Default;
if(NULL == dst_surface)
{
cudaSetDevice (surface->gpuId);
cudaStreamCreate (&cuda_stream);
NvBufSurfaceCreateParams nvbufsurface_create_params;
nvbufsurface_create_params.gpuId = surface->gpuId;
nvbufsurface_create_params.width = (gint) surface->surfaceList[0].width;
nvbufsurface_create_params.height = (gint) surface->surfaceList[0].height;
nvbufsurface_create_params.size = 0;
nvbufsurface_create_params.colorFormat = NVBUF_COLOR_FORMAT_NV12;
nvbufsurface_create_params.layout = NVBUF_LAYOUT_PITCH;
nvbufsurface_create_params.memType = NVBUF_MEM_DEFAULT;
int create_result = NvBufSurfaceCreate(&dst_surface,batch_size,&nvbufsurface_create_params);
}
NvBufSurfTransformConfigParams transform_config_params;
NvBufSurfTransform_Error err;
transform_config_params.compute_mode = NvBufSurfTransformCompute_Default;
transform_config_params.gpu_id = surface->gpuId;
transform_config_params.cuda_stream = cuda_stream;
err = NvBufSurfTransformSetSessionParams (&transform_config_params);
NvBufSurfaceMemSet (dst_surface, 0, 0, 0);
err = NvBufSurfTransform (surface, dst_surface, &nvbufsurface_params);
if (err != NvBufSurfTransformError_Success)
{
g_print ("Error: NvBufSurfTransform failed with error %d while converting buffer\n", err);
}
int templen = 0;
for(int i=0;i<2;i++)
{
NvBufSurfaceMap (dst_surface, 0, i, NVBUF_MAP_READ);
NvBufSurfaceSyncForCpu (dst_surface, 0, 0);
if(0 == i)
{
for (int n = 0; n < dst_surface->surfaceList[0].height; ++n)
{
memcpy((char*)snap_yuv_img.data+templen,(char *)(char*)dst_surface->surfaceList[0].mappedAddr.addr[i] + n * dst_surface->surfaceList[0].pitch,dst_surface->surfaceList[0].width);
templen += dst_surface->surfaceList[0].width;
}
}
else
{
for (int n = 0; n < dst_surface->surfaceList[0].height/2; ++n)
{
memcpy((char*)snap_yuv_img.data+templen,(char*)dst_surface->surfaceList[0].mappedAddr.addr[i] + n * dst_surface->surfaceList[0].pitch,dst_surface->surfaceList[0].width);
templen += dst_surface->surfaceList[0].width;
}
}
}
if (NvBufSurfaceUnMap (dst_surface, 0, 0))
{
printf("Error:NvBufSurfaceUnMap fail!\r\n");
}
}