WindowServer 让我产生了内存焦虑

2022-04-07 10:32:17 +08:00
 sickoo

作为 M1 16G 内存三大常驻客,一是 WindowServer ,另一个 Google Chrome helper ,最后一个 telegram 。

第二个没办法摆脱,safari 能接受但是习惯了 chrome ,习惯的法则。最后一个电报也是需要挂着,这时候会感叹微信的小而美了。

9029 次点击
所在节点    Apple
83 条回复
ShadowPower
2022-04-08 11:51:46 +08:00
@LotusChuan 回收不了,当然是
ShadowPower
2022-04-08 11:53:37 +08:00
@LotusChuan 一方面是做这些事情根本用不着如此多的内存,另一方面是内存不足的情况下它也不能收缩,根本不在程序控制范围内……
LotusChuan
2022-04-08 12:31:04 +08:00
@ShadowPower
1. 内存申请了不用很正常,其他操作系统像安卓也有空进程,当缓冲用加速的。
2. 要是给源码那还能看下是不是内存泄漏,然而 macOS 你看不了源码,内存管理逻辑也不清楚,万一它算内存是直接按虚表地址空间大小来的,那显示的内存再大也只能说明虚内存空间大而已,物理内存你又不知道。你有什么证据说它内存没回收吗。
EvilDevilJin
2022-04-08 12:48:39 +08:00
亲身体会,macOS 还是得重启的,真的越用越卡,内存占用越用越高。
我现在一周重启一次。
docx
2022-04-08 13:02:07 +08:00
Telegram Web 够用,网页能解决的问题从不装客户端
ShadowPower
2022-04-08 14:26:24 +08:00
@LotusChuan
1. 那些缓冲加速用的进程,在设计上就给了很低的重要性,内存不足的时候首先会把它们杀掉;
2. 系统内核里哪里有虚表的概念,那是 C++之类的语言为了实现多态而引入的设计。程序可以向系统申请一定大小的内存,可以是私有的,也可以是共享的(例如多个程序使用了同一个动态链接库)。如果没有 swapfile 这种设计,内存不足时其他程序当然就申请不到内存了。

当然我知道你想说的第二点是什么,其实这对应 Windows 的“提交大小”。也就是程序向系统申请的内存大小,而不是放在物理内存中的那部分大小。
但排查有没有发生内存泄漏的时候当然就是关注这个指标(即程序向系统申请的内存大小,而不是实际使用的),毕竟物理内存可能只有 8GB ,但程序却申请了 10GB ,其中一大半在 swapfile 里面。你去查看程序使用的物理内存大小,那永远不可能超过 8GB 。
这时候还要骗自己“它占的物理内存没有增加,所以没有内存泄漏”吗?

内存不足的时候,泄漏的这部分内存页面根据最近最少使用机制,当然优先被放进 swapfile 了。而且因为内存泄漏之后,程序逻辑里没办法访问它们,所以它们也没有机会再被放进物理内存中。

硬盘上多了一段永远不会用到的数据,大多数时候当然不会让系统变卡。当然,新程序启动的时候,或者程序打开一些文件的时候,系统把物理内存中的数据(也包括泄漏的部分)写到硬盘里,这时候会比以往要慢一些。

但因为大多数时候启动一个程序或者打开一个比较大的文件都得花上不少时间,稍微多个一两百毫秒,用起来根本没什么感觉。所以并不能根据“内存用了这么多还不卡”的主观感受来判断是不是内存泄露。

至于我有没有证据证明内存没有回收,你可以关注一下硬盘可用空间的大小,硬盘的写入量统计信息,以及为什么这个论坛里不少用户一星期要重启一次电脑。当然也有人不信,觉得 smartctl 的数据是假的。那就没有什么办法了。
LotusChuan
2022-04-08 14:56:35 +08:00
@ShadowPower
1.我本来就是要是说内存申请不用挺正常,这点你说会在内存不够的时候杀掉,确实,但是前提是内存不够。但是这是建立在内存不够的基础上,在系统觉得内存够的时候它留着也很合理,这时候你外部看着就是没回收,虽然你觉得内存不够了。此外我举这个例子的目的也已经达到了,就是说内存分配了不用很正常。

2.没,我说的虚表是 Page table ,内核给每个进程分配一个 Page table 我觉得起码是共识,如果一个进程实际使用的物理内存有一块映射到 0 上,另一块映射到 0xFFFFFFFFFFFF(12 个 F),那假设 macOS 一个页占 4k ,它实际上也就占了 8k ,然而如果 macOS 计算内存的方式是计算虚表内存空间的范围,那它算出来就是 2 ^ 36 ,也就是 64g 。

总之我想说的就是 macOS 内存分配逻辑它没告诉你,源码也没有,那它 swap 想怎么用怎么用,那个活动监视器想说占了多少内存就占了多少,你点个进程进去能看见 4 个内存的数据,从 MB 到 TB 不等。它真分配多少内存,说直接点,就是个黑盒,它就是骗你你也不知道啊。
ShadowPower
2022-04-08 16:36:18 +08:00
@LotusChuan 苹果确实没有什么文档来描述“内存”这一列数值的实际含义,不过,把整个页表的地址范围都显示出来并没有什么实际意义。从用户的角度来讲,用户看到这个数值,点一下排序,就可以知道什么程序占用了比较多的内存。结合用户的需求,就可以知晓,关掉哪个程序能够尽可能地腾出内存空间。

苹果倒是有一篇文章讲了内存系统的设计,但并没有说明“活动监视器”中“内存”这一列的含义。
https://developer.apple.com/library/archive/documentation/Performance/Conceptual/ManagingMemory/Articles/AboutMemory.html

这些程序确实是个黑盒,然后还没有相关的资料。但这反而让人感觉更不靠谱了。若你开发的软件真的存在内存泄漏的问题,也许你都没办法意识到这个问题存在。

然而几年前的 macOS 虽然长时间不重启也会出现一些小毛病,但各种系统进程的内存使用量数值也没有像现在一样夸张。我不敢保证它一定有某种问题,但我不觉得它没什么问题。

我只想说从“不卡,不影响使用”的角度来证明它没问题,其实不靠谱。真正的内存泄漏,在使用固态硬盘的情况下,还真的可能感觉不到“卡”。

那种卡顿感更多是机械硬盘带来的,Windows Vista 之后的 Windows 都有一项叫做“Ready Boost”技术,宣传你可以使用一个 U 盘(并没有多高的性能要求,只需要 USB 2.0 ,如今听起来已经有点离谱了)来提升电脑性能。因为 U 盘的随机读写性能好过机械硬盘。
当你的电脑有 SSD 的时候,这个功能的界面上就会显示,你的电脑已经不需要它了。
dier
2022-04-08 16:45:06 +08:00
内存不就是拿来用的吗?如果占用 1% 空闲 99%,那要这么多内存空间有啥意义
LotusChuan
2022-04-08 17:02:49 +08:00
@ShadowPower
苹果确实做了起码是类似于虚内存空间范围当内存的事情,你可以看一下进程数据,四个数据里面有一个明显很大,超过了物理内存和 swap 的总和,所以它到底怎么算内存还是不清楚。

到这里我说的一切你都没否认了,因为我本来就想说内存管理逻辑不清楚,所以看内存压力就行了。至于你提出的有没有内存泄漏,电脑卡是什么原因,你说这么多和我的观点也没什么交集,我不关心。就这样吧,别浪费时间了。
lutla
2022-04-08 17:13:31 +08:00
年经话题,建议焦虑症患者多焦虑一下自己的钱包房子车子
ShadowPower
2022-04-08 17:18:06 +08:00
@LotusChuan 我没有找到“超过了物理内存和 swap 的总和”的那一项。未分配的内存本来就不应该列出来。
如果你是指 kernel_task 的“实际内存(Real Mem)”很大的话,那是因为虚拟内存本身就是建立在这上面的,当然会显得很大。
我并不觉得是“显示有问题,实际没有问题”。只不过我只能从其他现象推测出可能存在内存泄漏问题,而不能向你保证它一定是这个问题。
binge921
2022-04-08 17:18:44 +08:00
要是工具能帮你赚钱 还是 64 玩的舒服
ShadowPower
2022-04-08 17:21:43 +08:00
@LotusChuan 我想到了一点,如果你看到一个进程的内存占用超过了系统的物理内存+交换的大小。那是因为还有“内存压缩”这一项,它算进了物理内存的大小里,而且是压缩之后的大小。
但进程的内存显示的是这部分数据解压缩之后的大小。
chenzheyu
2022-04-08 17:56:54 +08:00
WindowService 常年没超过 2g ,一般都是 1.5 到 1.7 之间飘
LotusChuan
2022-04-08 18:20:27 +08:00
@ShadowPower
我现在 Activity Monitor 点进去 WindowServer ,Memory 下有四个 Size ,其中第二个 Virtual Memory Size 大小是 40G ,然而我现在用的笔记本 Physical Memory 只有 16G ,加上 Swap 也就 17G ,所以很明显它用了 Virtual Address Range 来计算 Memory ,而这个得出的最多只是 Virtual Memory Range ,这还只是建立在它纯粹用 Virtual Address Range 来计算的基础上,因为我不知道它内存算法是什么,所以这也不一定是纯粹的 Virtual Memory Range 。更不用说其他的三个数据了,完全就是黑盒,四个数据没有一个是等于 Activity Monitor 里面显示的 WindowServer 的内存。所以你说我能靠 Activity Monitor 显示的“内存”知道这个应用到底用了多少内存吗?真别纠结了,看下内存压力就得了。

最后,我的观点已经全部证明过了,你说的内存泄漏 blabla 的我真不关心,真别浪费时间了。
jellyspot
2022-04-08 22:33:00 +08:00
内存不就是拿来用的吗?难道是拿来看的?
JackyCDK
2022-04-09 00:29:44 +08:00
买了 32G 回来开 pd 反正一直都是在 80%占用左右就再也没涨上去了,内存这玩意不就是拿来用的吗
kaz10025
2022-04-09 11:01:35 +08:00
关闭 promotion 你会发现新世界
MsHan
2022-04-09 22:40:26 +08:00
Google Chrome helper -- 这个是真流氓啊,我刚看了下列表里有一堆这个名字

telegram 和 微信占用差不多,都是两三百 MB

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/845423

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX