平头下雨不愁 2020-03-09 17:39 采纳率: 0%
浏览 258

程序没有动态分配内存,但内存一值在下降,初始可用22M内存,下降到6M左右,一下子又变为22M可用,咋回事啊?

1、我的开发环境。
海思 hi3516ev200,编译器 arm-himix100-linux-gcc,内核 linux-4.9.37。

2、遇到的问题。程序(有动态内存分配)刚跑起来时候,可用内存还有 22M,大概跑了 60 分钟,可用内存还剩下 6m。然后程序被强行杀死,内核打印类似 Out of memory: Kill process 的信息。所以我怀疑是内存泄漏导致内存耗尽,但我找不到到底是那里泄漏了。当我把很多无关进程去掉后,单独跑一个进程,该进程没有动态分配内存。也出现类似情况,但是内存下降至 6m 左右,一下子又提高到 22M ,程序没有被杀死。为什么会这样?内存变化情况如下,单位是K:

22284
21900
21772
21324
19500
19176
18792
18056
16904
16296
15560
14888
14216
12680
11448
10008
8536
6992
6756
22352
20656
20336
19472
18672
17968
15440
11040
69609
22088

3、代码很简单,最终在 while(1)循环不断通过 tcp 发送数据给服务器。

void* thread_report_device_info(void* arg)
{
    int sockfd;
    char ip_addr[IP_ALEN] = {0};
    struct sockaddr_in s_addr_in;

    char buffer[1024];
    int ret = -1;
    int len =0;
    int conn_state, i;

    INI_T *ini_info = (INI_T *)arg;

    int32_t mach = 0,macl = 0;

    printf("\n thread send device info start \n");
    while(1)
    {
        sockfd = socket(AF_INET,SOCK_STREAM,0);
        if(sockfd == -1)
        {
            printf("socket error! thread exit \n");
            break;
        }


        memset(&s_addr_in,0,sizeof(s_addr_in));
        s_addr_in.sin_addr.s_addr = inet_addr(ini_info->server_ip); 
        s_addr_in.sin_family = AF_INET;
        s_addr_in.sin_port = htons(SERVER_PORT);

        //set tcp keepalive
        set_tcp_keep_alive(sockfd);

                //connet
        conn_state  = 0;
        for(i = 0; i< 200; i++)
        {
            usleep(10000);
            ret = connect(sockfd,(struct sockaddr *)(&s_addr_in),sizeof(s_addr_in));
            if(ret == 0)
            {
                conn_state = 1; 

                ret = local_inet(ini_info->net_type,ip_addr,&mach,&macl);
                if (0 != ret){
                    printf("get local ip failed");
                    return NULL;
                }
                printf("ip_addr = %s, mac = %06x%06x \n", ip_addr, mach,macl);

                break;
            }
        }

        if(conn_state == 0)
        {
            printf("connect failed \n");
            close(sockfd);
            continue;
        }


        printf("connect success \n");

        int cnt = 0;
        while(1)
        {
            sleep(5);


            memset(buffer,0,sizeof(buffer));
            snprintf(buffer, sizeof(buffer), "{\"type\":0,\"opcode\":1,\"information\": {\"id\":\"112233445566\"},\"status\":{\"power\":100,\"temp\":56}}");
            cnt = strlen(buffer);
            printf("buffer = %s,    strlen(buffer) = %d\n", buffer, cnt);
            ret = write(sockfd,buffer,cnt);
            if(ret <= 0)
            {
                printf("send status info error \n");
                break;
            }
            printf("report device info to ai-box success \n");

        }
        close(sockfd);
    }
    return NULL;
}

4、哪位仁兄可以帮帮我? 谢谢。

  • 写回答

1条回答 默认 最新

  • 关注
    评论

报告相同问题?

悬赏问题

  • ¥15 python天天向上类似问题,但没有清零
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)