不可访问内存是指一组没有任何可访问指针指向的由计算机程序进行动态分配的内存块。
简介类似的,一个不可访问对象是指没有可访问引用型指向的动态分配对象。通俗来说,不可访问内存是程序无法直接访问的动态内存,同时也无法通过指针指向一个可访问的起始对象来进行访问。
动态内存分配的实现是采用了垃圾回收机制,在一个对象不可访问后,它会被回收。垃圾收集器能决定是否一个对象还是可访问的;任何被确定不可访问的对象将会被释放。在许多编程语言中(例如:Java,C#,D语言,Dylan)都使用了自动垃圾回收机制。
相反的,在动态内存分配机制中,当需要明确释放的内存变得不可访问时,此内存可以不再明确释放。在使用人工内存管理中,系统中的不可访问内存会导致内存泄漏。
一些垃圾收集器使用弱引用。如果一个对象能够通过弱引用或者包含弱引用的链接,那么这个对象可以被称为弱访问。垃圾收集器能够把弱访问的对象图视为不可访问的,并且释放它。(反过来说,防止对象被当作垃圾收集的引用被称为强引用;通过只含有强引用的链接来访问的弱可访问对象是不可访问的。)一些垃圾回收的面向对象语言,例如Java和Python,拥有弱引用的特性。Java包java.lang.ref提供了软引用,弱引用和虚引用,产生了其他对象访问状态可软访问和可虚访问。
不可访问内存往往和软件老化有关。1
内存泄漏在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。
内存泄漏通常情况下只能由获得程序源代码的程序员才能分析出来。然而,有不少人习惯于把任何不需要的内存使用的增加描述为内存泄漏,即使严格意义上来说这是不准确的。
内存泄漏会因为减少可用内存的数量从而降低计算机的性能。最终,在最糟糕的情况下,过多的可用内存被分配掉导致全部或部分设备停止正常工作,或者应用程序崩溃。
内存泄漏带来的后果可能是不严重的,有时甚至能够被常规的手段检测出来。在现代操作系统中,一个应用程序使用的常规内存在程序终止时被释放。这表示一个短暂运行的应用程序中的内存泄漏不会导致严重后果。
在以下情况,内存泄漏导致较严重的后果:
程序运行后置之不理,并且随着时间的流逝消耗越来越多的内存(比如服务器上的后台任务,尤其是嵌入式系统中的后台任务,这些任务可能被运行后很多年内都置之不理);
新的内存被频繁地分配,比如当显示电脑游戏或动画视频画面时;
程序能够请求未被释放的内存(比如共享内存),甚至是在程序终止的时候;
泄漏在操作系统内部发生;
泄漏在系统关键驱动中发生;
内存非常有限,比如在嵌入式系统或便携设备中;
当运行于一个终止时内存并不自动释放的操作系统(比如AmigaOS)之上,而且一旦丢失只能通过重启来恢复。1
内存管理内存管理,是指软件运行时对计算机内存资源的分配和使用的技术。其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源。
一个运行中的程序,譬如网页浏览器在个人电脑或是图灵机(Turing machine)里面,为一个进程将数据转换于真实世界及电脑存储器之间,然后将数据存于电脑存储器内部(在计算机科学,一个程序是一群指令的集合,一个进程是电脑在运行中的程序)。存储器能被实际组织在许多方法里头,例如磁带或是磁盘,或是小数组容量的微芯片。 从1950年代开始,计算机变的更复杂,它被连接于许多种类的存储器。内存管理的任务也变得复杂,甚至必须要在同一台机器上相同的时间运行多个进程。
在存储器内,一个程序(操作系统)在每一个数据区块持续地追踪实体位置,及移动实体上的数据去改善其性能及保证可靠性,对于每个用户层(user-level)的程序,操作系统分配一段虚拟内存空间,当进程起始时,不需要移动数据到实体设备间,数据存于磁盘内的虚拟内存空间,也不需要去配置主存空间给该进程,当用户有需要用到时,他们才会很自由地加载到主存内。
可以想像一个很大的程序,当他运行时变成进程,而大部分的存储器空间都被存到磁盘内虚拟内存地址,需要用到的部分才被加载到存储器内部提供服务。2
本词条内容贡献者为:
吴晨涛 - 副研究员 - 上海交通大学