【问题标题】:malloc function in virtual memory虚拟内存中的malloc函数
【发布时间】:2013-06-24 14:10:06
【问题描述】:

我读到 malloc 函数在堆上分配内存,堆驻留在 OS(Linux) 中的虚拟内存中。所以我有几个疑问:

如果使用 malloc 分配内存的进程被 kill 或退出自身终止而不释放内存。该内存是否会在终止后由操作系统释放,因为它位于虚拟内存中?

  • 如何知道 Linux 操作系统中的堆大小?
  • 如何在 Linux 操作系统中更改堆大小?

【问题讨论】:

  • “如果正在使用 malloc 分配内存的进程被终止或退出本身而不释放内存。终止后操作系统是否会像在虚拟内存中一样释放内存?”是的,所有操作系统都这样做(除了一些嵌入式设备等)。
  • 你的意思是从嵌入式设备中的堆分配的内存(其中没有虚拟内存)被杀死或退出而不解除分配创建内存泄漏问题?但是像ubuntu PC这样拥有虚拟内存的人会被操作系统释放,但不依赖于进程?
  • 如果应用程序结束(或强制关闭),每个操作系统都会释放应用程序请求的任何资源。如果您使用的操作系统不支持,您就会知道,相信我。
  • 是不是说Linux操作系统不会有内存泄漏问题?
  • 如果您在应用程序内部产生内存泄漏,那么您的应用程序只是丢失了对这些内存块的跟踪。但是,Linux 仍然知道该块已分配给运行程序的进程,因此它会在进程结束时处理它。资源管理是任何操作系统的重要组成部分。

标签: linux


【解决方案1】:

Will that memory be deallocated by the OS after the termination?
是的,它会,但我不会真正调用该释放(例如,在您进行所有分配之后,没有人会调用 free());发生的情况是分配给您的进程的虚拟地址空间(包括堆栈、堆、代码、.bss 和任何其他段)只是从操作系统中删除,因此映射到您的进程虚拟内存的任何物理内存区域其他任何人都可以使用(无需换入/换出)。 有关这方面的更多信息,请阅读this excellent article


How can I know heap size in Linux OS? ulimit -m
How can I change the heap size? ulimit -S -m X(其中 X 是以千字节为单位的堆限制)
如需更详尽的说明,请访问此SO question

【讨论】:

    【解决方案2】:

    分配给进程的内存在它正常终止或以其他方式终止时被释放。设置/检查堆大小use ulimit

    ulimit -m              # shows heap per process
    ulimit -S -m 1000      # set heap size to 1000 * 1024 bytes
    ulimit -S -m unlimited # unlimited heap size
    

    【讨论】:

    • 如果在 malloc 函数调用期间信号来了,什么时候回来。分配是否合适?
    猜你喜欢
    • 2012-05-14
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 2018-07-09
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    相关资源
    最近更新 更多