C语言中的垃圾回收分析.docC语言中的垃圾回收分析
摘要:c语言没有运行时库,无法自动压缩使用中的内存,缩小堆栈 所需内存空间。若只申请内存,没有释放,势必造成系统内存不断减少、 丢失。长时间的运行,最终导致系统死机。文章阐述了c语言垃圾产生的 原因,并从引用计数、标记一清除算法两方面提出如何实现c语言的垃圾 回收。
关键词:c语言;垃圾回收;引用计数;标记一清除算法
一般来说,操作系统记录了所有进程使用的全部资源,当系统进程结 束时,操作系统会将其所有资源回收,包括内存、寄存器和CPU等所使用 的资源。对于许多大型系统来说,一个进程或者程序往往会运行很长时间, 如网站进程、守护进程等。操作系统不会主动释放这种进程所占用的资源。 如果进程在使用完后内存资源却没有及时释放,就会造成系统内存不断减 少、丢失,累积到一定程度,会导致系统无内存可用,进而导致系统无法 运行或者错误,严重的甚至死机。
C语言是一种可以直接与操作系统底层交互的语言,它没有运行时库。 运行时库可以压缩使用中的内存,缩小堆栈所需内存空间。因此C语言编 程中的内存管理依赖程序编写人员。因此,本文将详细阐述C语言中的垃 圾回收问题,并阐明其产生原因和常用的回收技术等,以帮助基于c语言 的程序开发者更好地设计和实现高效的垃圾回收机制。
1C语言中垃圾产生的原因
在C语言开发中,内存分配有3种方式:一是函数体内的局部变量, 在栈上创建。如void fun () {int a; },变量a在函数fun ()执
行结束时会自动释放。二是静态存储区域分配。如static int x=l;变量 x为静态变量,生存期较长,从第1次使用就始终存在,直到整个程序结 束时自动释放。三是动态内存分配,在堆上分配,通过malloc或calloc 申请,通过free释放。此种方式比前2种在内存使用上更加灵活,是编 写大型程序不可缺少的内存分配方式。但是它却存在一个致命的风险。在 一个函数体内通过malloc或calloc申请的动态内存由另外一个函数体使 用,程序员很容易忘记在使用后通过free释放,该内存块将保持在系统 内并一直处于被分配状态,导致后面程序可申请的内存空间严重不足。并 且这种情况下,也很难查找出内存泄露发生在什么地方。这些内存块被称 为垃圾。因此在C语言程序中,引入了垃圾收集器概念,它是一种动态存 储分配器,可定期识别垃圾块,并相应地调用free函数,将这些垃圾块 回收到空闲的内存链表中。
2 C语言中垃圾回收基本原理
垃圾回收因高级编程语言迅猛发展而得到广大程序员的重视,但实际 上垃圾回收的历史最早始于1960年的Lisp语言。Lisp语言高度依赖动态 内存分配,所有数据几乎都是在堆上分配的。程序设计者必须找到一种方 法来自动管理每一块内存,否则程序员会被数不清的“申请内存”和“释 放内存”淹没,或者计算机内存很快被消耗殆尽,这促使垃圾回收技术的
产生。
一个垃圾回收模块有3个基本要求:无内存泄漏;能够自动回收无用 内存;能够内存整理或内存紧缩。
程序中所有已分配的内存都有其对应的指针指向它,若一块内存没有 任何指针指向它,称为内存泄漏,即该块内存是无用内存块且不可达。在 程序运行的任意状态中,寄存器(考虑多核CPU在多线程下)、程序栈和 静态数据段中所有指针的集合叫根集。可达指的是这块
C语言中的垃圾回收分析 来自淘豆网m.daumloan.com转载请标明出处.