gpt4 book ai didi

memory-management - 操作系统如何知道我的应用程序使用了多少内存? (为什么它不进行垃圾收集?)

转载 作者:行者123 更新时间:2023-12-04 07:45:59 24 4
gpt4 key购买 nike

当我的任务管理器(top、ps、taskmgr.exe 或 Finder)说一个进程正在使用 XXX KB 内存时,它到底在计算什么,它是如何更新的?

在内存分配方面,用 C++ 编写的应用程序与作为虚拟机运行的应用程序(如 .NET 或 Java 之类的托管代码)是否与操作系统“看起来”不同?

最后,如果内存如此透明——为什么垃圾收集不是操作系统的功能或服务提供的?

事实证明,我真正感兴趣的是为什么操作系统不能进行垃圾收集和碎片整理内存空间——我认为这是“简单”为进程分配地址空间的一个步骤。

这些答案很有帮助!谢谢!

最佳答案

这是一个很大的话题,我不能希望在这里用一个单一的答案来充分回答。我建议拿起一份 Windows Internals ,这是一种无价的资源。 Eric Lippert最近有一篇博客文章很好地描述了如何查看操作系统分配的内存。

进程使用的内存基本上只是 address space由操作系统保留,可能由物理内存、页面文件或文件支持。无论是托管应用程序还是 native 应用程序,这都是一样的。当进程退出时,操作系统会删除它为其分配的内存——虚拟地址空间被简单地删除,页面文件或物理内存后备可供其他进程使用。这就是操作系统真正维护的所有内容 - 地址空间到某些物理资源的映射。映射可以随着进程需要更多内存或空闲而转移——物理内存内容可以由操作系统转移到磁盘,反之亦然以满足需求。

根据这些工具,进程正在使用的内容实际上可能意味着几件事之一 - 它可以是分配的总地址空间、分配的总内存(页面文件 + 物理内存)或进程实际使用的驻留在内存中的内存。任务管理器为这些可能性中的每一种都有一个单独的列。

操作系统无法进行垃圾收集,因为它无法了解该内存实际包含的内容 - 它只查看已分配的内存页,而看不到可能会或可能不会被引用的对象。

虽然操作系统在虚拟地址级别处理分配,但在进程本身中还有其他内存管理器,它们获取这些大的、页面大小的块并将它们分解成一些对应用程序有用的东西。 Windows 将返回以 64k 边界分配的内存,但随后堆管理器将其分解为较小的块,供程序通过 new 完成的每个单独分配使用。 .在 .Net 应用程序中,CLR 将从垃圾收集堆中传递新对象,当该堆达到其限制时,将执行垃圾收集。

关于memory-management - 操作系统如何知道我的应用程序使用了多少内存? (为什么它不进行垃圾收集?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1090511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com