异步释放堆内存

程序对于堆内存的自动管理分为CPP一类的自动引用计数和Java的GC。Android app有时卡顿一下,因为程序在集中释放堆。如果把自动释放堆放到其他线程中,程序运行效率是否进一步提高?

//
//  main.c
//  AsynchronousRelease
//
//  Created by 孙树港 on 2024/1/4.
//

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <time.h>

#define size 1024*1024

int *p[500];

void myfunc()
{
    for (int i = 0; i < 500; i++) {
        free(p[I]);
    }
    
    return ;
}

int main(int argc, const char * argv[]) {
    // insert code here...
    clock_t begin,end;
    begin=clock();
    
    pthread_t th1;
    //循环堆内存分配和释放
    for (int i = 0; i < 500; i++) {
        int *num = NULL;
        num = (int *) malloc(size);
        memset(num, '*', size);
        p[i]= num;
        
        //puts("do something ");
        //free(num);
    }
    //myfunc();
    pthread_create(&th1, NULL, myfunc, NULL);
    end=clock();
    printf("%lf\n",(double)(end-begin)/CLOCKS_PER_SEC);
    printf("Main Function Over!\n");
    return 0;
}

把malloc的地址存放到指针数组中。然后集中进行释放。当在主线程调用myfunc函数与异步调用程序快了0.1。无论是自动引用计数还是java GC机制,原理类似,使用一个容器存放指针,在合适的时机集中释放。

本程序,同样进行集中释放,只不过不影响主线程。

image.png
image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容