百科问答小站 logo
百科问答小站 font logo



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

  

user avatar   haozhi-yang-41 网友的相关建议: 
      

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

别看程序员平时一个个自黑,黑得很嗨。但是当真正面对自己工作中的黑点时,大家都不提了。一个个都辩解说:内存不用就是浪费——但问题是,在大多数场景下,那些内存里存的数据,恐怕大都是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   pansz 网友的相关建议: 
      

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


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


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


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


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


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


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


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


user avatar   li-maskr 网友的相关建议: 
      

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

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


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

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


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


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


终上。


user avatar   hqythu 网友的相关建议: 
      

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

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

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


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


user avatar   Ivony 网友的相关建议: 
      

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


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

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


user avatar   kennethtse 网友的相关建议: 
      

感谢

@sxc

邀请。非常非常感谢。

为了防止邀请我的sxc老师撤销邀请,我不得不截图。


@朱峰女士,你的答案,为了防止你进行修改,我已经截图了。没错,如你问题当中所说,礼貌是不是软弱?

当然不是。

我自问是一个普通人,在知乎得到关注多,也只是因为我勤勤恳恳,一个字一个字写得多,仅此而已。

我去咕咚网之前,当过记者,做过公关,我也不是什么名校毕业,但是我深深知道,原创是品德,是节操。做记者,报道要如实,要客观,要中立,要还原事情的本来面目。

我为什么要在微信群“红包体育”里面和你抬杠,为什么要质问你,想必你已经不记得了,然而我记得清清楚楚。


我不关注你的微信号,那是有非常重要的原因的。朱峰女士,你说你没做过亏心事,那么想必在你看来,未经他人许可引用、转载他人原创的内容,不算是亏心事了。


你不记得的事情,我一点一点帮你回忆起来吧。事情当然没有这么简单。

当你加入“红包体育”的时候,我对群主说了一句话。【我很高兴,我有不删除任何聊天软件当中聊天记录的好习惯。】


这里截图当中的日期是一直就存在的。至今我的iPhone 4S也一直在用呢,不可能改掉。


你为什么和我说抱歉,你忘了?2015年3月3日你所说的,是真的都不记得了?


当时我的反应,算是很克制的了,毕竟当着“红包体育”群里这么多人的面。

为什么我过了这么久,才再次在“红包体育”群里质问你,我想你应该明白。我知道每个人做自媒体不容易,想靠着才华变现,更加不容易,当时你肯道歉,说你会改,那么我也就得过且过了。


问题的关键在于,你改了吗?如果你改了,你就不会不经过

@式微

同意,转载她的答案,而且还将她列为“第二作者”。

你的所谓声明,夹杂在你的正文内容当中,而不是正式开辟一个子栏目道歉,被诸多的信息噪声遮盖着,这就是你的诚意?

上述三张截图,是2015年6月17日早上8:43时截的。我现在还很怕诸多水军说我图片造假呢。下面两张图,是2015年3月3日晚上20:49时截的。那个时候,你的微信ID还没有“太阳表情”。

这个总不能说我作假了吧?



而你在面对我的质疑的时候,说了些什么话,你还记得吗?这就是我为什么要截图的原因。

二次编辑加了些东西,就可以等同于你自己的原创,是吗?


事实证明我当初心一软得过且过,才是真的错误。


你说了“最初开时,格式内容混乱,但转载内容标明了作者”——我还是那句话:用了我的东西,问过我吗?

你说了“微信对于转载格式有了新要求后,我们也跟着学习,把之前来源不明的全部删除。之后再也没有出现不合规的转载“——来源不明?请看看截图,你自己说过的话,怎么就这么快忘了呢?”是从虎扑、知乎、直播吧很多来源的文章“,这还算是来源不明?

你说了“暴力行为冠以道德名义,缺又恰恰选择了一个认真做事的自媒体下手,无论是出于要稿费,还是炒作涨粉,都不会实现的”——暴力冠以道德的名义?我质问你,就是暴力,你不告而拿,拿了我的答案,也拿了知乎上别人的答案,这种偷窃行为,就是道德的?


另外,请弄清楚,到底谁在炒作?我只是把原文作者式微老师带到了“体育红包”群,让她自己和你说清楚,这就是炒作?式微维护自己正当权益没有成功,自己写了篇专栏,以正视听,这叫炒作?

你说了“另外。。。您在背后诽谤我的许多聊天截图我已经给了律师。我们没做亏心事,我们礼貌但不软弱,真的,用法律途径解决,只对我们单方面有利啊。但您若真的要这样苦苦相逼,请也不吝给我一个您的地址,给您去一封律师函”。


我在背后诽谤你?请把截图放出来,让知乎用户都看看,我到底怎么诽谤你了。


你没做亏心事?没做亏心事我会质问你为什么不经过我允许转载了我的内容?


说我苦苦相逼?到底谁逼谁?“咕咚-李旸”是我在“红包体育”群里的ID,那是因为之前说过要标清楚所在的企业、媒体和姓名,所以我这样写。


我再说一次:质问你,是因为你在知乎未经我许可,擅自转载和引用了我的内容;我质问你,是因为你在知乎未经式微老师的许可,擅自转载和引用了式微老师的内容。


知乎上的回答问题,是我业余时间所为,工作忙的时候我只能下班回答问题,晚上写公众号内容,或者把知乎的答案放到我自己的公众号上去。关于足球篮球的内容,和咕咚网没有一点关系,全部是我自己的业余创作。


而你,直接找到了咕咚创始人、CEO申波先生,也就是我的最高领导,去质问我的行为是代表咕咚,还是代表个人。


我在知乎的ID和个人说明写得清清楚楚,没有和咕咚有任何的关联。你没有经过我个人的允许,转载引用我在知乎的内容,被我质疑你转载了别人的内容,居然好意思说是“法律层面的诽谤”?居然还去和我供职的企业对质?


到底是谁苦苦相逼?


所谓认真做事的自媒体,是把知乎用户的文字答案,变成自己的声音和话语,放到视频当中去,是吗?


所谓认真做事的自媒体,是未经他人许可,擅自转载、引用他人在知乎的原创答案,是吗?



最后我很想问一句:你既然深知自媒体人的成长有多么不易,为什么你还要去做“未经许可,擅自转载和引用其他自媒体人的内容”这样的事情?


最后,是我放出的所有截图的具体信息。



我在这里声明:我是知乎用户李暘,在知乎的每一个答案,在知乎的每一篇专栏文章,不敢保证完美无缺,逻辑严密,没有错别字,但全部是我自己的原创内容,任何人未经我许可,转载、引用、抄袭我的答案,即为侵权行为。




  

相关话题

  想给男朋友送个显卡,是不是分体水冷男生会比较喜欢? 
  开发人员如何构建自己的学习笔记系统? 
  如何看待物理学家 Lee Phillips 对 Python 的批评? 
  大牛Bengio 团队最新的研究和我自己之前的研究成果重复了,应该怎么办? 
  在今天胆机还有有什么优势?音色、寿命、功耗方面表现如何? 
  配电脑在网上买零件再请师傅上门组装好还是找网上那些博主配好? 
  以下我关于虚拟地址与物理地址的理解是正确的吗? 
  这款Altec MZX399耳机怎么样? 
  计算机如何理解图像? 
  显卡降价这事开始有苗头了吗?你如何看待这件事? 

前一个讨论
华裔物理学家、丹华资本创始人张首晟去世,如何评价他的成就和贡献?
下一个讨论
Vue 和 React 的优点分别是什么?





© 2025-01-03 - tinynew.org. All Rights Reserved.
© 2025-01-03 - tinynew.org. 保留所有权利