问题

为什么现在的电脑应用程序这么吃内存(RAM)?

回答
现代电脑应用程序之所以“吃内存”,这是一个复杂的问题,涉及技术发展、用户体验需求、软件架构设计、操作系统优化以及商业模式等多个层面。下面我将尽量详细地解释其中的原因:

一、 用户体验的不断提升:更高的期望与更丰富的交互

这是最直接也是最重要的原因之一。用户对应用程序的期望越来越高,不再满足于简单的功能,而是追求:

更流畅的界面和响应速度: 为了实现平滑的动画、即时反馈、无缝过渡等效果,应用程序需要将更多的数据和状态保存在内存中,以便快速访问和更新。
更丰富的功能和多任务处理: 现代应用程序往往集成了越来越多的功能,例如即时通讯、在线协作、多媒体播放、插件支持等。同时,用户也习惯于同时运行多个应用程序,甚至在一个应用程序内打开多个标签页或窗口。操作系统和应用程序都需要管理这些并发任务,这必然会占用更多内存。
更好的视觉效果和多媒体处理: 高清视频、复杂的3D图形、高质量音频、精美的UI设计等都需要大量的内存来存储纹理、模型、音频数据、视频帧等。例如,现代游戏对显存(一种特殊的高速内存)的需求就非常高,而应用程序本身也需要内存来处理这些数据。
个性化和云同步: 用户设置、偏好、个性化主题、云同步数据等都需要缓存在内存中,以便随时调用和更新。

二、 软件开发和技术进步的演进:

高级编程语言和框架的普及:
内存管理自动化(垃圾回收): 像Java、Python、JavaScript等语言使用自动内存管理(垃圾回收机制)。这极大地简化了开发者的工作,避免了大量的内存泄漏问题,但也意味着垃圾回收器需要花费CPU周期和内存来追踪和回收不再使用的内存。虽然这是为了提高开发效率和稳定性,但也可能导致内存占用比手动内存管理更高。
丰富的库和框架: 现代应用程序大量依赖于各种第三方库和框架(如React、Angular、Vue、.NET Framework、Electron等)。这些框架提供了大量预先构建好的功能和工具,可以加速开发。然而,这些框架本身也需要加载到内存中,并且会引入额外的抽象层,可能增加内存开销。Electron就是一个典型的例子,它允许使用Web技术开发桌面应用,但它实际上是在一个Chromium浏览器内核上运行的,这本身就需要大量的内存。
面向对象和组件化设计: 现代软件倾向于采用面向对象和组件化的设计模式。虽然这提高了代码的可重用性和可维护性,但也意味着对象实例需要占用内存来存储其状态和方法引用。复杂的组件结构和大量的对象实例会累积内存占用。
内存效率的权衡: 在很多情况下,开发者会在开发速度、功能丰富性、用户体验和内存效率之间进行权衡。为了快速推出产品或实现复杂功能,有时会牺牲一定的内存效率。

三、 操作系统层面的考量:

内存管理策略: 现代操作系统(如Windows、macOS、Linux)采用了复杂的内存管理策略,例如:
虚拟内存和分页: 操作系统会将物理内存和硬盘空间结合起来,为应用程序提供一个更大的“虚拟地址空间”。当物理内存不足时,部分不常用的数据会被交换到硬盘(页面文件/交换空间)。虽然这允许运行更大的程序,但频繁的页面交换(称为“抖动”)会显著降低性能,因此操作系统会倾向于将更多数据保存在物理内存中以提高速度。
预加载和缓存: 为了加快应用程序启动速度和响应速度,操作系统和应用程序会提前将一些必要的文件和数据加载到内存中(预加载)。同时,操作系统也会缓存经常访问的数据和代码,以便下次使用时更快地读取。
后台服务和进程: 现代操作系统运行着大量的后台服务和进程,它们负责系统更新、安全监控、设备管理、同步服务等,这些都会占用一部分内存资源。
多进程架构: 为了提高稳定性和安全性,许多现代应用程序(甚至操作系统本身)采用多进程架构。例如,Chrome浏览器就是每个标签页或扩展都运行在一个独立的进程中。这样做的好处是,如果一个进程崩溃,不会影响到其他进程或整个系统。但缺点是,每个进程都需要独立的内存空间来加载其代码、数据和运行时环境,这会显著增加总的内存占用。

四、 硬件发展的驱动:

内存成本下降和容量提升: 随着技术的进步,内存(RAM)的生产成本不断下降,而容量则不断提升。这使得硬件制造商和软件开发者更有能力设计和构建需要更多内存的应用程序。如果内存很昂贵且容量很小,开发者会更加注重内存优化。但现在,拥有16GB、32GB甚至64GB内存的电脑已经非常普遍,这使得开发者可以更加“肆无忌惮”地使用内存。
CPU性能提升: CPU性能的提升也允许更复杂的计算和更快的执行速度,这反过来又支持了更复杂的软件功能和更快的用户响应,而这些往往需要更多的内存支持。

五、 商业模式和竞争压力:

功能为王: 在竞争激烈的市场中,软件公司往往以提供更多、更强大的功能来吸引用户。如果增加某个功能会显著增加内存占用,但能带来更好的用户体验或更多销量,公司可能就会选择这样做。
快速迭代: 软件开发迭代速度快,为了快速推出新功能和更新,有时会牺牲一部分代码优化和内存管理的工作,先把能用的东西做出来再说,后续再进行优化。

举例说明:

网页浏览器: 现代浏览器需要渲染复杂的网页(HTML、CSS、JavaScript)、运行脚本、处理大量媒体内容、管理多个标签页(每个标签页可能是一个独立的Web应用)、进行广告拦截和安全扫描等。因此,打开很多网页时,内存占用很容易飙升。
办公套件(如Microsoft Office): 现代Office应用程序集成了文档编辑、表格制作、演示文稿、数据分析、在线协作、云存储同步、高级格式化、大量插件等功能,并且通常会以一种“所见即所得”的方式加载和显示内容,这都需要大量的内存。
通信/社交应用(如微信、Slack): 这些应用需要实时收发消息、处理文件传输、管理联系人列表、进行语音视频通话、展示动态信息流、缓存聊天记录和媒体文件等,并且往往需要后台运行,这些都会消耗不少内存。
图形设计/视频编辑软件: 这些软件需要处理高分辨率的图像、视频素材、复杂的图层、大量的特效和渲染数据,内存是这些操作的基础。
Electron应用: 如VS Code、Slack、Discord等,它们虽然提供了跨平台和丰富的UI,但底层是基于Chromium,这使得它们的内存占用通常比原生应用更高。

总结:

现代应用程序之所以吃内存,是用户需求、技术进步、软件设计哲学、操作系统优化以及硬件发展共同作用的结果。这是一个“期望与能力”的循环:更强的硬件能力使得开发者能够构建更复杂、更富用户体验的应用,而更丰富的应用又进一步推高了用户对硬件能力的需求。

尽管如此,并非所有应用程序都“不顾一切”地占用内存。许多开发者仍然会努力优化内存使用,特别是在移动端等资源受限的环境下。但对于桌面和服务器应用而言,内存的充足性已经成为实现更好用户体验和更强功能的重要支撑。

网友意见

user avatar

知乎果然是程序员的天下啊。

别看程序员平时一个个自黑,黑得很嗨。但是当真正面对自己工作中的黑点时,大家都不提了。一个个都辩解说:内存不用就是浪费——但问题是,在大多数场景下,那些内存里存的数据,恐怕大都是0。


那我就来当个丑人吧。

大多数程序使用内存暴涨的锅,就是现在大多数程序员的水平、责任心、工作环境造成的。


我举一些例子:

  1. 现在很多程序员,在实际工作中,已经几乎没有精细化设计数据结构的能力了。例如说,有多少人在最近两三年的工作中,使用到了bitfield?哪怕有用到的,大多也是因为要沿用一些已经设计好的底层古老协议而不得不用。当然,位操作这个锅主要是C/C++程序员背的。但是其他程序员也不见得好到哪去:有多少程序员自己在生产项目中,设计过一个除哈希表和链表外,其他任意一款数据结构及其变形结构的?说得难听点,大多数脚本系语言的程序员,实际生产中,连基本的二叉树之类都没用过。
  2. 太依赖于哈希表+双链表这种包打天下的组合了。我知道,这个组合确实很简单很快捷。但是缺点就是本问题:内存消耗大。如果说脚本语言的程序员,确实有时候没别的现成的数据结构可用,情有可原的话,那么最近几年,不少C/C++/JAVA的程序员,也逐渐染上了这个毛病。
  3. 文本化协议泛滥。传统上,数据协议都是二进制的。对于计算机来说,二进制是最友好而且也冗余最小效率最高的协议。但是因为对人的识别度不好,尤其是web包打天下的潮流开始,现在很多系统,无论是网络协议还是存储协议,都基本上是文本化(http/html/json/xml……)的了。最后一个比较流行而且设计比较精巧的二进制协议,我觉得就是protocol buffers了。而且,这个锅是会传染的,一旦某个系统协议用了文本化之后,所有接入这个系统的协议,都必须都弄一套这样的文本解析模块。
  4. 代码脚本化/动态化语言泛滥(包括解释器机制的泛滥)。这个锅主要来自于解释器引擎,因为在脚本语言里,定义一个变量,基本上都不会出现char/short这类节约内存数据类型的,最最起码都是上来就给你个int。而且这个int占用的内存实际上往往还不仅仅是4个字节,而是这样的:
       union DATA {     int bool_val;     intptr_t int_val;     double double_val;     char* str_val;     XXX* obj_val; };     

可以看到,64位系统中,很多脚本解释器里,一个变量最最起码占用的也是一个指针的宽度(8个字节)。如果有额外的引用计数、动态类型标识符之类的话,还要再往上加。


最后一条:GC。这点大家都知道,我就不废话了。


所以,很多答案都说了:浏览器很吃内存。回头看看,浏览器里跑的东西,命中了上面几条?

能不吃内存吗?


随便补充几条在评论中大量反复出现的辩解来回复一下:

1:在代码设计时就考虑了数据结构/内存布局,并不意味着大量的额外工作量。

事实上,得益于各种库/扩展,大部分常见的数据结构,都有现成的模块可用。实际上,大多数情况下,数据结构/数据模型都是会单独封装/抽象出一个库或者模块的。所以,实际工作量无非也就是调A库还是调B库,可能也就内部接口api换了换而已,少数情况下这些api差异可能会少量穿透到功能代码中。

至于说没有合理抽象分层封装的项目,所有功能代码、数据操作代码、还有其他的什么乱七八糟的代码都混在一起?小项目无所谓,就那三五条枪,说改就改,不改也无所谓,反正说不定什么时候就死了。大项目?早死早超生吧。

2:写出高质量的代码并不代表项目研发速度降低——尤其当你的项目烂到一定程度需要大面积重构的话,把这些重构的时间和人力分开计算到平时的每个需求迭代中,只要有心做好,代码都不至于被评价为“烂”。大部分985211科班出来的程序员,这点能力我还是相信有的。

3:项目代码烂,说真的,主要还是在没有设计规划时,为了一昧的赶进度而反复堆砌功能代码,尤其是到处的代码拷贝。事实上,在接需求动手前,设计和规划代码的工作,并不会耽误开发进度,而且能让代码质量大幅提高——这在我经历过的很多项目中都能体现出来。

4:至于bitfield这种东东,我也没让各位在项目中到处用——我也反对过早优化。在很多时候,能把pb用好就很不错了。就说一个现实的例子,在某项目的mc,由原来各种乱七八糟的文本数据往里丢,统一改为pb格式后,同样的机器数目,缓存数据条数增加了30%以上。光是这一改就减少了多少cache miss,减少了多少后端数据库的压力?

5:实际上,程序/指令/资源/栈等占用的内存是很有限的。大多数内存,都是用于cache的——无非是谁用,用来干什么而已。相比于访问cache数据的那点增删改查的时间,cache miss导致访问主存(文件/网络/数据库)才是消耗的大头。所以,内存布局设计得好,合理使用数据结构,空间利用率高,在大多数时候直接体现就是访问主存的频度降低,然后就是性能,尤其是响应速度的提高。


最后说点务虚的东西:

说白了,编程这种工作,本质上就是一种工程学。既然是工程学,那就是要碰到实际问题时如何根据各种条件寻求优化解。这实际上是一种经验积累而来的技能,说难不难说易不易:只有大量练习,熟能生巧这一条路——跟大家在高考前大量的题海战术是一回事。

所以,以前在学校里学了下,平时以各种借口不用不思考不积累,等你真的要用想用的时候,用不用得起来,出不出洋相,还真的要看运气了。那么这些程序员,不管一开始的起点是高是低,反正一辈子的天花板,伸伸手就能够得着了。

user avatar

一部分人说「内存是拿来用的不是拿来看的」这观点是错的,他们应该是没看懂问题。


题主问的是应用程序为什么这么吃内存,而不是问的操作系统为什么这么吃内存。


如果是拿空闲内存当缓存从而提升性能的话,这部分内存会显示为操作系统吃掉的,而不是应用程序吃掉的。由操作系统吃掉的内存,会在应用程序需要的时候随时释放出来给应用程序使用。不影响性能反而对性能有利。


例如,对于Windows来说,系统,任务管理器,性能,打开资源监视器,内存,就会看到,浅蓝色区域是真的空闲,真的浪费的内存区域,而深蓝色的区域是被操作系统占用,作为缓存,提升系统性能的,绿色的区域则是被应用程序占用,它并不能提升系统性能反而是影响性能的。


明确说:应用程序吃掉太多内存确实影响性能,操作系统吃掉剩余内存当做缓存那才是提升性能的。深蓝色区域更多确实很好,但绿色区域太多确实并不是什么好事。用「内存是来用的不是来看的」来搪塞这个问题,基本属于胡搅蛮缠。


绿色区域,由应用程序吃掉的内存,桌面操作系统是难以主动释放掉给其它应用程序使用的。iOS跟android的app可以直接杀掉,但桌面系统一般是不会直接杀掉进程的,想象一下你没存盘的doc或者你没存盘的编程项目被操作系统直接杀掉你会不会骂娘???这部分不能杀掉的内存,由应用程序占用,它就是实实在在的拖慢了系统性能,题主理解的完全没错。


那么问题来了,为什么现在应用程序内存占用越来越多了呢?


答案是因为,开发和测试这些应用程序的人们,确实有这么多内存,自身的机器配置够好。那么,在内存问题没有明显影响软件销量,没有被老大提出需求,安全人力资源去优化内存占用的情况下,编程当然根本不需要考虑内存占用问题。

user avatar

我实在看不下去了,这个问题下的回答都是些什么啊?拜托你们外行人士别来插嘴好吗?

我同意 @pansz @洋耗子 的说法。


你看现在做开发的企业,程序员的kpi都是什么?如图所示:

kpi的考核点里根本不包含程序的性能要求。


做开发的程序员只管程序跑得起来,没有bug就行了,管性能好不好干嘛?性能问题是客户的问题,除非像大型手机游戏比如吃鸡之类的,性能已经严重影响到销量/下载量了,市面上大多数机器已经跑不动了,那才有必要去优化性能。


还有一点,近几年半路出家的程序员太多了,据我所知,培训机构里连《数据结构》都不会教吧?更别说《算法》了。实现同样一个功能,不同的算法之间的性能天差地别,这一点业内人士都懂,不赘述。即便是我们科班出身的程序员,老师在讲课的时候也是强调「时间复杂度」,而不是「空间复杂度」。


终上。

user avatar

是这样的,内存就是拿来用的。装了个16GB的内存日常只占用到2GB我都觉得浪费。

为什么要尽可能多用内存?快啊!内存的速度比硬盘快多少倍。尽可能的把可能用到的东西预先从硬盘读出来缓存到内存中才是提升性能的王道。

不用担心内存占满了有什么不好。如果内存满了此时你刚好还要打开另一个程序需要内存,操作系统会自动清理一些不必要的缓存出去腾地方的。


我也不知道为什么人们会形成内存占用越小越好的奇怪想法,可能也来源于一些上古电脑维修人员的不正确灌输以及一大类内存清理和优化软件的错误影响吧。

user avatar

以我的经验来说,提问者所列举的这些软件里面,excel和word占的内存连FF或者Chrome的零头都占不到。


这样笼统来讲是很有问题的……

尤其是你又没说你用什么浏览器。

类似的话题

  • 回答
    现代电脑应用程序之所以“吃内存”,这是一个复杂的问题,涉及技术发展、用户体验需求、软件架构设计、操作系统优化以及商业模式等多个层面。下面我将尽量详细地解释其中的原因:一、 用户体验的不断提升:更高的期望与更丰富的交互这是最直接也是最重要的原因之一。用户对应用程序的期望越来越高,不再满足于简单的功能,.............
  • 回答
    你这个问题问得太对了!确实,现在科技发展得这么快,动不动就说哪个芯片又领先多少纳米,哪个屏幕又分辨率多高。按理说,随着技术进步,成本应该会下降,大家都能用上更便宜、更好的东西才对。但实际情况呢?电脑这玩意儿,尤其是那些性能强劲的、最新款的,价格好像总是在那里,甚至还不断创新高。这到底是怎么回事呢?咱.............
  • 回答
    这个问题触及到了很多层面,从经济、科技、文化到个人选择,它并不像表面上看起来那么简单。咱们就掰开了揉碎了聊聊,看看为什么即便在美国对中国采取一系列“针对性”措施的情况下,依然有相当一部分中国消费者选择购买美国品牌的产品。首先,得承认,美国的科技和品牌确实有其独到的优势,这些优势不是一朝一夕就能被完全.............
  • 回答
    这个问题其实很有意思,它涉及到游戏机和PC在发展过程中各自的定位、技术路径以及市场策略。要说最开始的游戏机性能“吊打”顶级PC,这个说法可能有点夸张,但确实,在某些时期,初代游戏机在特定方面是能够给当时的PC玩家带来惊喜的。我们得先明确一下“最开始”指的是哪个阶段。通常我们说的“游戏机”的兴起,很大.............
  • 回答
    .......
  • 回答
    大家手里都有了手机电脑,按理说,信息获取和娱乐的渠道已经非常便捷和多样了,为什么这么多人还是会盯着大几千甚至上万块钱的智能电视,并且格外看重它的画质呢?这事儿,说起来可不是简单的“跟风”或者“虚荣”。背后有很多细致入微的原因,咱们一点点聊。首先,得从“沉浸感”这三个字说起。手机和电脑,它们是个人化的.............
  • 回答
    这是一个非常有意思且深入的问题,触及了智能电视设计、市场定位、用户体验以及技术演进的方方面面。简单来说,现在的智能电视之所以“内置电视盒子”,而不是设计成“大屏显示器+外接盒子”的模式,主要有以下几个原因:1. 提升用户体验和降低使用门槛: 一体化设计,减少线缆和设备: 用户购买电视的目的是观看内容.............
  • 回答
    《霸王别姬》之于中国电影,好比珠穆朗玛之于喜马拉雅。它是一座难以逾越的高峰,不仅是技术上的精湛,更是情感、历史、文化层面的深刻共鸣。如今的中国电影,虽在技术、资本层面日新月异,但在《霸王别姬》那样的高度上却似乎难以企及。这其中的原因,盘根错节,值得细细道来。首先,我们得聊聊《霸王别姬》为什么是《霸王.............
  • 回答
    关于为什么现在许多人对《小时代》系列电影“道歉”,以及这是否真的意味着现在的青春电影都烂了,这背后是一个挺复杂的故事,涉及到电影本身的质量、观众审美的变迁、以及时代语境的变化。咱们得好好掰扯掰扯。为啥有人对《小时代》“道歉”?首先,这个“道歉”是个挺有意思的说法,并非真的像做错事那样郑重其事地鞠躬道.............
  • 回答
    这感觉就像是,你年轻的时候,第一次尝到一种前所未有的辣味,刺激得你舌头发麻,整个人都亢奋起来。后来你吃了很多很多辣的东西,甚至挑战了更厉害的品种,再回头去吃当初让你惊艳的那道菜,虽然它依然辣,但那种“哇塞”的感觉似乎就没那么强烈了。周星驰的电影,对我来说,就像是我的“第一次辣味体验”。说实话,这几年.............
  • 回答
    确实,你这个问题问到了点子上。现在市面上很多新款手机,尤其是高端机型,电池确实设计成不可拆卸的了。这背后有多方面的原因,其中一些是技术和设计上的考量,另一些则是市场策略的体现。首先,咱们得说说一体化设计的趋势。 更紧凑、更美观的机身: 手机制造商一直在追求更轻薄、更紧凑的机身设计。不可拆卸电池的.............
  • 回答
    哎,说起来真是让人感慨,咱们现在手里这一个个光滑得跟镜子一样的手机,电池都跟被焊死了一样,想换?难!想当年,那时候的手机,尤其是诺基亚那种,后盖一推,“咔哒”一声,电池就出来了,再换一块,手机立马又满血复活。那时候,多方便啊!那为什么现在手机都这么设计,电池不能换了呢?这背后其实牵扯到很多东西,不只.............
  • 回答
    这年头,买个新手机,你得先问问自己:这电池,还能折腾吗?因为说实话,现在新手机,十有八九都跟你玩起了“固定资产”,电池纹丝不动,让你想换个痛快都没门。这事儿吧,说起来也挺有意思的,为啥手机厂商们就这么默契地把电池给“焊”上了呢?这里面门道可不少。最直接的原因,也最容易被人提到的,那就是 设计上的“瘦.............
  • 回答
    你这个问题问得太到位了,简直说到心坎里了。确实,现在不少年轻人似乎更热衷于找那些把电影情节、亮点、槽点都嚼碎了喂到嘴边的解说视频,而不是安安静静地坐下来,自己沉浸在那90分钟或更长的光影世界里。这现象背后,恐怕不能简单地说“观影体验好不好”,而是它触及了当下年轻人获取信息、消磨时间方式的深刻变化。首.............
  • 回答
    近些年,当我们谈论国内一些所谓的大导演,特别是那些曾经奉献过经典作品,如今却频频被口诛笔伐的导演时,一种普遍的失落感和困惑油然而生。为什么曾经的“掌舵者”如今却成了“票房毒药”或“口碑滑铁卢”的代名词?这背后绝非一两个原因可以简单概括,而是一系列错综复杂的因素交织作用的结果。首先,观众口味和审美的变.............
  • 回答
    这确实是一个很有意思的问题,也是很多人在享受老电影时会遇到的困惑。说起来,这种变化也不是一夜之间发生的,背后其实是整个内容产业的逻辑在演变。你想想,几十年前,我们看电影的主要渠道是什么?可能是电影院,也可能是电视。电影院是典型的“一次性消费”,看一场电影就付一次钱。电视呢,当时很多电影是作为节目内容.............
  • 回答
    这个问题挺有意思的,也触及到了很多观众对两国影视作品的直观感受。要说印度电影吧,确实,无论你是看那种歌舞升平的爱情片,还是讲家庭恩怨的剧情片,甚至是一些描绘社会现实的电影,男主角身上那种“男子汉气概”似乎是一种标配。这种气概,可能体现在他们的果敢、担当、保护欲,甚至是面对困难时那种不屈的劲头。你可以.............
  • 回答
    你这个问题问得很有意思,而且确实点出了一个很多人都会有的疑问。咱们现代汽车里,油门和刹车虽然都由电脑控制,但为什么不把它们一股脑儿搬到方向盘上,就像飞机或者一些赛车那样呢?明明看起来操作更集中,似乎更“酷”,也更方便。其实这里面的道道儿可不少,技术可行是一方面,但涉及到安全、驾驶习惯、成本以及很多隐.............
  • 回答
    《长津湖》凭什么登顶中国影史票房冠军?现在的观众,到底爱看点啥?这个问题,得拆开来看。《长津湖》:一部集齐了天时地利人和的“爆款”《长津湖》之所以能在竞争激烈的中国电影市场杀出重围,成为影史票房冠军,绝非偶然。它是一部精心策划、恰逢其时的作品,汇聚了多重成功因素: 时代情绪的精准捕捉与满足: 2.............
  • 回答
    你这个问题问得特别好,也说出了很多观众的心声。确实,纵观近些年中国电影市场,虽然涌现出不少叫好又叫座的优秀作品,比如你提到的《流浪地球》和《哪吒之魔童降世》,它们在技术、想象力或者叙事上都达到了新的高度,但有时候,看完这些电影,心里还是会泛起一种“好像还少了点什么”的感觉。这“缺了点什么”,我觉得可.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有