.NET内存分配笔记

.NET 中由 CLR 负责内存管理。

 

CLR 管理的内存区域主要有:

 

线程的堆栈 :用于分配给值类型的实例。堆栈主要由操作系统管理,不受 GC 的控制。当值类型所处的方法结束,相应的存储单元自动释放。执行效率高,但容量小。

  对于局部的值类型变量,操作系统维护着一个堆栈指针来指向下一段自由空间。由高地址向低地址填充。

 

GC :用于分配给小对象实例。如果引用类型对象的实例大小小于 85000Byte, 实例将被分配于 GC 堆上。 GC 堆可能会被压缩。

 

LOH Large Object Heap :用于分配给大对象实例。当引用类型对象的实例大小不小于 85000Byte 时,实例将被分配在 LOH 上。不会被压缩,且只有在完全 GC 回收时才被回收。

 

 

托管堆 .NET 应用程序在进程初始化之后, CLR 会在进程的可用地址空间中保留一段地址空间,称为托管堆。它是进程中可用地址空间中的一段,因此不对应任何物理内存。

 

  托管堆分为 GC Heap Loader Heap GC Heap 用于存储对象实例,受 GC 管理;而 Loader Heap 又分为 High-Frequency Heap Low-Frequency Heap Stub Heap ,不同的 heap 又存储不同的信息。 Loader Heap 中最重要的信息是元数据 (MetaData) 相关的信息,也就是 Type 对象,每个 Type 对象在 Loader Heap 上体现为一个 Method Table Method Table 中记录了存储的元数据信息,如基类型、静态字段、实现的接口、所有的方法等。 Loader Heap 的生命周期为从 AppDomain 创建到卸载。

 

  托管堆中维护着一个 NextObjPtr 指针 , 指向托管堆中下一个新建对象的位置。 CLR 初始化时, NextObjPtr 指向托管堆的基地址,于堆栈相反,由低地址向高地址填充。

 

每个对象创建时都包含 2 下列两个附加成员:

      TypeHandle, 类型句柄,指向对应实例的 Method Table. 4Bytes.

      SyncBlockIndex, 用于线程同步,指向一块被称为 Synchronization Block 的内存块,用于管理对象同步。 4Bytes.

 

 

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C语言中,可以使用malloc函数来动态分配内存给指针。malloc函数的原型为void* malloc(size_t size),它接受一个size_t类型的参数,表示要分配的字节数。malloc函数返回一个指向分配内存的指针,如果分配失败,则返回空指针(NULL)。 使用malloc函数分配内存的基本步骤如下: 1. 定义一个指针变量,用于接收分配内存的地址。 2. 使用malloc函数分配内存,传入所需的字节数作为参数。需要注意的是,malloc函数返回的是void*类型的指针,通常需要进行强制类型转换。 3. 检查malloc函数的返回值是否为NULL,以确保内存分配成功。 4. 如果分配成功,可以通过指针变量进行操作和访问分配的内存空间。 5. 使用完毕后,记得使用free函数释放已分配的内存,以避免内存泄漏。 以下是一个示例代码,演示如何使用malloc函数分配内存给指针: ```c #include <stdio.h> #include <stdlib.h> int main() { int* ptr = NULL; int n; printf("请输入要分配的元素个数:"); scanf("%d", &n); ptr = (int*) malloc(sizeof(int) * n); if (ptr != NULL) { printf("内存分配成功!\n"); // 可以对ptr指针进行操作和访问分配的内存空间 } else { printf("内存分配失败!\n"); } free(ptr); // 释放已分配的内存 return 0;} ``` 在上述代码中,我们首先定义了一个指向int类型的指针变量ptr,并初始化为NULL。然后,通过scanf函数获取要分配的元素个数n。接下来,使用malloc函数分配了n个int类型的内存空间,并将返回的地址强制类型转换为int*类型,并赋值给ptr。然后,我们检查ptr是否为NULL,以确定内存分配是否成功。最后,使用free函数释放已分配的内存。 需要注意的是,在使用malloc函数分配内存后,需要在不再使用分配的内存时及时使用free函数释放内存,以避免内存泄漏问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C语言学习笔记(指针 地址 动态内存分配)](https://blog.csdn.net/m0_62510826/article/details/126639863)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值