从内存管理这个话题产生出来,所有的程序员就都对此非常感兴趣,而且觉得很神秘。
最早的计算机,一直到IBM发明的卡片输入和纸带输入计算机,行业中还没有内存这个概念,所以也就没有内存管理这个需求。后来发明了内存芯片,那时已经接近八十年代了。当时流行的计算机语言是C语言和Fortran语言,主要是在大型机上运行。此外还有Apple II,运行自己开发的Basic语言。
当时,内存分为存放系统代码的固化内存和用户使用的动态内存,内存管理只与动态内存有关。当时的内存管理需要系统管理员给分配内存容量和运行权限,分配后由系统按照用户的操作使用内存,也就是说、用户是无权知道内存有关的任何细节的。而Apple II 则提供了监控指令和汇编伪指令,可以使用户直接使用和操作内存系统。
在早初的时候,C语言提供了变量声明而且还提供了为指针分配内存的伪指令,Fortran语言则支持变量声明和不太好用的数据交换区,来使用内存。二者共同的特点是,用户可以使用内存、却不知道具体的细节。所以,除了汇编语言,所有的程序开发环境或者语言、都对程序员隐藏了与内存有关的细节。
至于内存有关的话题是如何引起了广泛的关注的?应该说,是与微软有关的。
PC 的升级使用户拥有了使用大量内存的可能,但是大量内存的管理成了新的问题。有专业公司发现,Dos系统对内存的分配和管理是极不负责的:所有运行程序被装入时被分配占用64K内存,之后装入的程序、被安装在前一程序实际占用内存的尾部紧邻的整位地址。于是,他们就按照自己想好的出错模型、编制代码,设法证明这一设计缺陷。但奇怪的是,Dos系统并没有崩溃或者发生异常。不过,人们已经知道“DOS系统是不够安全的系统”了。
之后,微软进入了Windows时代,但是从Dos时代产生的不安全感、并没有解除,反而因为其新推出的开发工具Windows API的复杂性、而直接进入了程序员的工作体验。与之相关的就是内存泄漏与堆崩溃。所谓内存泄漏,就是一种代码缺陷:程序声明的内存占用、在程序被卸载后、还留存在系统中。可能产生内存泄漏的原因:对C语言来说,一般与静态变量或者指针分配后忘记收回有关;对Windows 开发来说,大多与使用资源后没有释放有关。至于堆崩溃,主要是指:发生内存泄漏后、系统没有发现,在短时间内发生积累,占用了系统的内存资源、使系统没有内存可用,这种情况。当然,堆崩溃这种情况在Windows系统运行时会被遇到,但通常只是局部问题(运行中的程序被系统关闭),很少会造成系统死机。于是,对Windows 系统的不信任感、因此被加强了。
再然后,为了改善和减少、内存泄漏和堆崩溃的发生,垃圾收集技术应运而生。内建了垃圾收集机制的Java 语言受到了广泛关注和一致好评,虽然这种服务过去一直由系统提供。
严格的来讲,内存管理相关的技术、对于程序员来说,只是个知识性的问题;系统永远不可能提供相关的技术手段、来让程序员自主操作或者管理内存系统。
全文完。
网友评论