通常来说,内存中的划归为CLR的堆,在CLR中被分两个对象,分别为小对象和大对象,小对象包含了三代,分别为0代,1代,2代,大对象只有一个代就是3代。
CLR分配内存的时候,首先尝试从自由列表(a_fit_free_list_p)分配,如果没有成功,则从堆段中分配。
代码如下:
BOOL gc_heap::a_fit_free_list_p (int gen_number,
size_t size,
alloc_context* acontext,
int align_const)
{
BOOL can_fit = FALSE;
generation* gen = generation_of (gen_number);//获取当前代
allocator* gen_allocator = generation_allocator (gen);//获取当前代的自由空间
size_t sz_list = gen_allocator->first_bucket_size();//获取当前代自由空间的bucket的大小
//循环遍历自由空间的桶
for (unsigned int a_l_idx = 0; a_l_idx < gen_allocator->number_of_buckets(); a_l_idx++)
{
//当分配的长度小于自由空间桶的长度或者当前循环已经到了桶的最后一项
if ((size < sz_list) || (a_l_idx == (gen_allocator->number_