知乎果然是程序员的天下啊。
别看程序员平时一个个自黑,黑得很嗨。但是当真正面对自己工作中的黑点时,大家都不提了。一个个都辩解说:内存不用就是浪费——但问题是,在大多数场景下,那些内存里存的数据,恐怕大都是0。
那我就来当个丑人吧。
大多数程序使用内存暴涨的锅,就是现在大多数程序员的水平、责任心、工作环境造成的。
我举一些例子:
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导致访问主存(文件/网络/数据库)才是消耗的大头。所以,内存布局设计得好,合理使用数据结构,空间利用率高,在大多数时候直接体现就是访问主存的频度降低,然后就是性能,尤其是响应速度的提高。
最后说点务虚的东西:
说白了,编程这种工作,本质上就是一种工程学。既然是工程学,那就是要碰到实际问题时如何根据各种条件寻求优化解。这实际上是一种经验积累而来的技能,说难不难说易不易:只有大量练习,熟能生巧这一条路——跟大家在高考前大量的题海战术是一回事。
所以,以前在学校里学了下,平时以各种借口不用不思考不积累,等你真的要用想用的时候,用不用得起来,出不出洋相,还真的要看运气了。那么这些程序员,不管一开始的起点是高是低,反正一辈子的天花板,伸伸手就能够得着了。
一部分人说「内存是拿来用的不是拿来看的」这观点是错的,他们应该是没看懂问题。
题主问的是应用程序为什么这么吃内存,而不是问的操作系统为什么这么吃内存。
如果是拿空闲内存当缓存从而提升性能的话,这部分内存会显示为操作系统吃掉的,而不是应用程序吃掉的。由操作系统吃掉的内存,会在应用程序需要的时候随时释放出来给应用程序使用。不影响性能反而对性能有利。
例如,对于Windows来说,系统,任务管理器,性能,打开资源监视器,内存,就会看到,浅蓝色区域是真的空闲,真的浪费的内存区域,而深蓝色的区域是被操作系统占用,作为缓存,提升系统性能的,绿色的区域则是被应用程序占用,它并不能提升系统性能反而是影响性能的。
明确说:应用程序吃掉太多内存确实影响性能,操作系统吃掉剩余内存当做缓存那才是提升性能的。深蓝色区域更多确实很好,但绿色区域太多确实并不是什么好事。用「内存是来用的不是来看的」来搪塞这个问题,基本属于胡搅蛮缠。
绿色区域,由应用程序吃掉的内存,桌面操作系统是难以主动释放掉给其它应用程序使用的。iOS跟android的app可以直接杀掉,但桌面系统一般是不会直接杀掉进程的,想象一下你没存盘的doc或者你没存盘的编程项目被操作系统直接杀掉你会不会骂娘???这部分不能杀掉的内存,由应用程序占用,它就是实实在在的拖慢了系统性能,题主理解的完全没错。
那么问题来了,为什么现在应用程序内存占用越来越多了呢?
答案是因为,开发和测试这些应用程序的人们,确实有这么多内存,自身的机器配置够好。那么,在内存问题没有明显影响软件销量,没有被老大提出需求,安全人力资源去优化内存占用的情况下,编程当然根本不需要考虑内存占用问题。
我实在看不下去了,这个问题下的回答都是些什么啊?拜托你们外行人士别来插嘴好吗?
你看现在做开发的企业,程序员的kpi都是什么?如图所示:
kpi的考核点里根本不包含程序的性能要求。
做开发的程序员只管程序跑得起来,没有bug就行了,管性能好不好干嘛?性能问题是客户的问题,除非像大型手机游戏比如吃鸡之类的,性能已经严重影响到销量/下载量了,市面上大多数机器已经跑不动了,那才有必要去优化性能。
还有一点,近几年半路出家的程序员太多了,据我所知,培训机构里连《数据结构》都不会教吧?更别说《算法》了。实现同样一个功能,不同的算法之间的性能天差地别,这一点业内人士都懂,不赘述。即便是我们科班出身的程序员,老师在讲课的时候也是强调「时间复杂度」,而不是「空间复杂度」。
终上。
是这样的,内存就是拿来用的。装了个16GB的内存日常只占用到2GB我都觉得浪费。
为什么要尽可能多用内存?快啊!内存的速度比硬盘快多少倍。尽可能的把可能用到的东西预先从硬盘读出来缓存到内存中才是提升性能的王道。
不用担心内存占满了有什么不好。如果内存满了此时你刚好还要打开另一个程序需要内存,操作系统会自动清理一些不必要的缓存出去腾地方的。
我也不知道为什么人们会形成内存占用越小越好的奇怪想法,可能也来源于一些上古电脑维修人员的不正确灌输以及一大类内存清理和优化软件的错误影响吧。
以我的经验来说,提问者所列举的这些软件里面,excel和word占的内存连FF或者Chrome的零头都占不到。
这样笼统来讲是很有问题的……
尤其是你又没说你用什么浏览器。
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有