GC算法实践(一) 内存分配篇

本文探讨实现垃圾回收算法的内存分配方法,包括堆的管理、对象结构及操作,分配内存的策略,并提供了测试辅助方法和测试案例,展示了如何在C语言中进行高效内存管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要实现自己的垃圾回收算法,首先要实现一套自己的内存分配方法,把内存的管理权掌握在自己手里,而不是每次都调用系统函数,向操作系统要一小块内存,否则垃圾回收就无从谈起。思路主要是:

一开始申请一块大的内存,后面每次程序需要内存就从这个内存块中分配,不够了再想办法处理(垃圾回收、压缩、分配更大的内存等)。

上面申请的一块大的内存一般叫做堆(heap)。名字叫什么不要紧,反正就是内存的一部分,申请下来后都归自己管理了。

很多软件都用类似的方法来管理内存,借鉴市场经济的做法,从多次的少量”购买“变成一次”大量批发“,的确是一种进步。

1. 关键数据结构与基本操作

1.1 堆的结构以及基本操作

目前我们只需要知道堆(heap)的起始地址、堆中空闲内存的起始地址、堆的结束地址即可。

定义一个数据结构来表示堆(各字段含义如其名字所示):

typedef struct _Heap {
    char *start_addr;
    char *free_addr;
    char *end_addr;
}Heap;

示意图如下:

这里写图片描述

创建一个堆可以用如下方法:

Heap* new_heap(uint size) {
    Heap *heap = (Heap*)malloc(sizeof(Heap)+size);
    heap->start_addr = (char*)heap + sizeof(Heap);
    heap->free_addr = heap->start_addr;
    heap->end_addr = heap->start_addr + size;

    return heap;
}

够简单了吧,无须解释。

1.2 对象的结构以及基本操作

堆是用来动态分配内存给对象用的,所以我们还得需要知道对象的结构。参考“自制Java虚拟机”中对象的结构,当前为了测试方便,定义对象的结构如下(包含对象的一些头部信息以及对象的字段指针):

typedef struct _Object {
    char flag;
    ushort length;
    char* fields;
}Object;

示意图如下:

这里写图片描述

关于对象,有如下基本操作:

// 1.获取整个对象的占用空间大小
#define OBJ_SIZE(obj) (sizeof(Object) + (obj->length<<2))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值