在使用君正x2000平台的时候,应用程序的内存占用会逐渐增大,之后应用程序最后会被kill掉。通过分析原因发现,在一个线程中申请内存,而申请的这个内存在另一个线程中进行释放,释放完成后这个线程结束,这样操作就会造成内存泄漏。
这是很简单的生产者消费者的问题,理论上来说不应该出现这样的问题,所以在x86和arm下进行测试,并没有发现类似的情况,然后确定是君正x2000平台的问题。将问题提给了君正,目前君正正在排查。
下面是我的简单的测试代码,大家可以测试以下自己的平台:
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
static pthread_mutex_t addr_mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t free_mutex = PTHREAD_MUTEX_INITIALIZER;
static void *addr;
static int is_free;
static void malloc_test(int size)
{
pthread_mutex_lock(&addr_mutex);
addr = malloc(size);
printf("==========================\n");
printf("malloc: %p\n", addr);
pthread_mutex_unlock(&addr_mutex);
}
static void free_test(void)
{
pthread_mutex_lock(&addr_mutex);
printf("free: %p\n", addr);
printf("==========================\n");
free(addr);
pthread_mutex_unlock(&addr_mutex);
}
/*
* 不存在内存泄露
*/
void test1()
{
while (1) {
malloc_test(260);
free_test();
usleep(100000);
}
}
static void *free2_thread(void *arg)
{
pthread_detach(pthread_self());
free_test();
pthread_mutex_lock(&free_mutex);
is_free = 0;
pthread_mutex_unlock(&free_mutex);
return NULL;
}
/*
* 一个线程中分配内存,另一个线程中释放内存,释放完成后,释放线程结束,只要内存分配小于517存在内存泄露
* cat proc/进程号/status
*/
void test2()
{
pthread_t thread;
while (1)
{
malloc_test(516);
pthread_mutex_lock(&free_mutex);
is_free = 1;
pthread_mutex_unlock(&free_mutex);
pthread_create(&thread, NULL, free2_thread, NULL);
while (is_free) {
usleep(1000);
}
}
}
static void *free3_thread(void *arg)
{
pthread_detach(pthread_self());
while (1) {
free_test();
pthread_mutex_lock(&free_mutex);
is_free = 0;
pthread_mutex_unlock(&free_mutex);
usleep(10000);
}
return NULL;
}
/*
* 一个线程中分配内存,另一个线程中释放内存, 释放线程不结束的情况下,不存在内存泄漏
* cat proc/进程号/status
*/
void test3()
{
pthread_t thread;
pthread_create(&thread, NULL, free3_thread, NULL);
while (1)
{
malloc_test(516);
pthread_mutex_lock(&free_mutex);
is_free = 1;
pthread_mutex_unlock(&free_mutex);
while (is_free) {
usleep(1000);
}
}
}
void main(void)
{
//test1();
test2();
//test3();
}
|