codehz
codehz
这家伙很懒,什么也没写!

注册于 3年前

回答
2
文章
0
关注者
0

(你要是觉得 windows 的这个难以看懂,那 Linux 这边会更让人吃惊,因为起码 windows 还能算准总的内存使用,linux 干脆连总总量都有多种不同口径)
前面说了,主要的问题在于多个进程之间可以有共享内存,这意味着计算的时候,有 3 种可能的思路,分别满足三种特性中的两个,即所谓不可能三角

  1. 不算共享的,这就会导致直接相加后少于实际内存使用
  2. 算共享的,这就会导致直接相加后多于实际内存使用
  3. 算共享的,但是那部分数据除以被共享的次数,可以让加起来的总和等于实际内存使用,但是可能会出现开新进程后,单个进程显示内存使用率反而降低的反常情况

(这 3 种算法就是所谓的 USS RSS PSS )
可以看出,并不存在一种完美的算法能准确衡量单个进程的内存使用。
而之所以说 Linux 这边更复杂,则是因为 Linux 默认启用了 overcommit 特性,加了个 VSS 指标,申请的内存可以大于实际使用的。这下好了,连找到总内存利用率都变成了不可能的任务。好多人在 Linux 下试图做 fallible allocator,实际根本没用,OOM 基本都是发生在访问内存而不是分配内存的时候。

如果你想“内存占用就非常清晰”的话,推荐去“详细信息”页面看“Working set”这一项,不过这一项是把 private 和 shared 算在一起的,会出现重复计算的问题。
至于“进程”页面里的“内存”,似乎没有提供选项设置为“Working set”。

Linux 的 glob 是 shell 处理的
Windows 是直接传原始命令行

发布
问题