【问题标题】:Memory used by a long running process on OS XOS X 上长时间运行的进程使用的内存
【发布时间】:2013-02-08 18:13:17
【问题描述】:

我想确保长时间运行的数字运算算法不会占用太多内存。该算法用 C++ 编写并在 OS X 上运行。一个大大简化的版本是:

int main() {
    while (someCondition) {
        // notice nothing is allocated on the heap
        vector<int> v(10, 0);
    }
}

我已经使用 Instruments(分配和泄漏)分析了代码。我没有看到任何泄漏。虽然“实时字节”计数看起来不错(徘徊在 20 MB 左右),但“总字节”计数却在不断增长。让我担心的是,当“总计数”达到大约 80 GB 时,我收到了 OS X 警告说硬盘空间不足(我有一个 120 GB 固态磁盘)。我不太了解操作系统/进程交互,所以我想问一下:

在第一个进程被杀死或不再运行之前,在基于 UNIX 的操作系统上长时间运行的进程使用的内存是否可供其他进程使用?

编辑:看起来我误解了 Instruments 中的“总字节数”数字:Instruments ObjectAlloc: Explanation of Live Bytes & Overall Bytes。当我在 Activity Monitor 中查看进程时,“真实内存”基本上是不变的。

【问题讨论】:

  • 我不得不说,如果使用量像这样增长,那么某些地方正在堆上分配而不是释放。
  • 你在valgrind下运行过进程吗?如果不是,为什么不呢?或者,更重要的是,这样做。有些东西正在泄漏,无论是显示的矢量还是其他东西,您都需要找到它。确保你可以停止你的进程。

标签: macos unix memory-management


【解决方案1】:

您收到磁盘空间警告的原因可能与虚拟内存分配有关。每次您的进程(或操作系统)请求内存时,它通常首先在后备存储 - 交换中“分配”。

总虚拟内存是可用交换空间加上 RAM 的大小。我无权访问 OSX,我知道它按自己的规则运行,但必须有一个显示交换使用情况的命令

swap -l  (Solaris)
swap -s   (Solaris)
free (linux)

我想出的唯一命令是vm_stat,加上top - 看起来 top 可能最接近我所说的。

【讨论】:

  • Mac OS X 上的命令不是“交换”。我不确定它是什么,但事实并非如此(或者,至少在 Mac OS X 上的 /bin/usr/bin/sbin/usr/sbin/usr/local/bin 中没有 swap 10.7.5)。这不会使您的答案无效......它只是限定它。
  • @Johnathan - 你说得对,我试图展示类似 UNIX 的命令在其他方面的工作,以及我可以为 OSX 挖掘的内容。进行了编辑。
猜你喜欢
  • 2015-04-23
  • 1970-01-01
  • 2013-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多