首页 > 系统相关 >Linux学习笔记6 进程角度看内存泄露

Linux学习笔记6 进程角度看内存泄露

时间:2024-06-04 19:31:11浏览次数:41  
标签:malloc 释放 笔记 空间 内存 Linux 进程 GB

一,从进程角度看堆区内存申请与释放问题

1,c语言中的内存泄漏

内存溢出:申请内存时,没用足够的内存可以使用。 

内存泄露:严格来说,只有对象不会再被程序用到了,但是GC又不能回收它们的情况,才叫内存泄漏

                宽泛的讲,实际情况中很多时候一些不太好的实践会导致对象的生命周期变得很长甚至导致OOM,也叫“内存泄漏”

        申请了内存用完了不释放,如申请了1024M内存,分配了512M内存一直不回收,那么可用内存就只有512M,仿佛泄漏掉一部分。

         内存泄漏的增多,最终会导致内存溢出。

2,malloc申请一块空间,直到进程结束都不释放,是否造成内存泄露

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>

int main()
{
char * s = (char*)malloc(128);
assert(s != NULL);
exit(0);
}

如果程序持续运行,那么内存是不会被释放的,但如果如我给出的程序一样,那么内存将在程序结束的时候有系统自动回收。

3, malloc 申请 1G 的内存空间是否能成功?

我们试图申请1G空间,并且如果申请失败则打印error exit。

从上图我们可以看出,我们成功申请了1G空间。

4,在物理内存只有 2G 的系统中,malloc 能否申请 2G 空间?

1,地址空间限制:首先,我们需要考虑进程的地址空间限制。在 32 位系统中,一个进程的地址空间通常被限制在 2 GB 到 4 GB 之间,这取决于操作系统和配置。由于地址空间需要为代码、数据、堆栈和其他内存段共享,因此实际上可用的堆内存空间可能会小于 2 GB。在 64 位系统中,地址空间要大得多,通常不会受到这种限制。

2,系统预留和其他进程的内存使用:即使系统总共有 2 GB 内存,操作系统的内核和系统服务也会占用一部分内存。此外,其他正在运行的进程也会占用内存。因此,可用的内存量可能会小于 2 GB。

3,虚拟内存和交换空间:即使物理内存不足,现代操作系统通常会使用虚拟内存和交换空间来扩展可用内存。这意味着,即使物理内存不足,malloc 也可能成功分配 2 GB 内存,因为系统可以使用磁盘上的交换空间来模拟更多的内存。

5,malloc 与 fork

父进程堆区申请的空间复制后,子进程也会有一份,也需要释放?

观察上面的程序,我们发现,父子进程都成功打印了数据,这是否意味着,在复制进程后,是否子进程也拥有了malloc出来的空间呢。

在linux操作系统中,当你使用fork系统调用创建一个子进程时,子进程会获得父进程的虚拟内存空间的副本,包括代码段、数据段、堆栈和堆。这意味着,如果父进程在fork之前使用malloc分配了内存,那么子进程也会有这些内存区域的副本。

这个副本是写时复制的(copy-on-write),这意味着在父进程或子进程尝试修改这些内存页之前,它们实际上并不会在物理内存中复制。只有在其中一个进程尝试写入时,操作系统才会为写入的页创建一个物理内存中的副本。

关于内存释放,有以下三点需要注意:

1,父进程释放内存:如果父进程在fork之后释放了内存,这不会影响子进程的内存副本。子进程仍然可以访问和修改它的内存副本。

2,子进程释放内存:同样,如果子进程释放了内存,这不会影响父进程的内存。每个进程都有自己的地址空间和独立的内存管理。

3,避免内存泄露:在fork之后,如果两个进程都试图访问和释放相同的内存区域,可能会导致双重释放的问题,这是需要避免的。通常,子进程会在exec系统调用之后立即执行新的程序,这将替换掉当前进程的地址空间,包括堆。在这种情况下,子进程不需要关心父进程的malloc分配的内存释放问题,因为新的程序会重新初始化其内存空间。

标签:malloc,释放,笔记,空间,内存,Linux,进程,GB
From: https://blog.csdn.net/2303_76580416/article/details/139388061

相关文章

  • 数据结构学习笔记-简单选择排序
    简单选择排序的算法设计与分析问题描述:设计并分析简单选择排序【算法设计思想】迭代选择:算法通过循环遍历数组,进行size次迭代。最小值选择:在每次迭代(i)中,算法致力于找到未排序子数组(arr[i]到arr[size-1])内最小元素的索引。这个最小元素将被选出来进行交换。交......
  • 05-Excel基础操作-学习笔记
    使用分列工具整理数据导出的数据是文本文件即以.txt结尾的文件,放入Excel中,是一种常见的操作。具体操作打开文本格式的数据,Ctrl+A全选——Ctrl+C复制——新建excel表格——点击A1单元格(注意,这里不要双击)——Ctrl+V粘贴——选中A列——数据选项卡——分列——勾选“分隔符号(D)”......
  • Archlinux安装教程
    先放张图:  准备工作1、进入Live环境后关闭reflectorsystemctlstopreflector2、使用iwctl联网3、timedatectl修改时区timedatectlset-timezoneAsia/Shanghai4、date验证时间fdisk-l查看硬盘和分区情况cfdisk<硬盘编号>修改分区如:cfdisk/dev/sda5、......
  • 网络技术零基础小白入门课程-深信服内部课程 笔记
    02-家庭组网介绍:Q:交换机比路由器速度更快,为什么还比路由器便宜?A:交换机工作在数据链路层,而路由器工作在网络层,因此路由器软件逻辑、硬件成本更高。 03-衡量网络性能的指标Q:在线用户、并发连接用户的概念一样吗?A:不一样,在线用户是已经访问网站的,并发连接数则是与网站进......
  • 在Linux系统minIO的下载和使用
    1.安装docker1.1卸载旧版docker首先如果系统中已经存在旧的Docker,则先卸载:yumremovedocker\docker-client\docker-client-latest\docker-common\docker-latest\docker-latest-logrotate\docker-logrotate\docker-engine1.2配......
  • Linux服务器磁盘清理与Inode节点清理指南
    Linux服务器磁盘清理与Inode节点清理指南在管理Linux服务器时,定期清理磁盘空间和inode节点是维护系统性能和稳定性的重要任务。磁盘空间清理可确保系统不会因为空间不足而出现问题,而inode节点清理则有助于避免系统因过多小文件而性能下降。本指南将介绍如何执行这些清理操......
  • 英语学习笔记31——Where‘s Sally?
    Where’sSally?Sally在哪?词汇Vocabularygarden/ˈɡɑːrdn/n.花园,院子(属于私人)区别:parkn.公园(公共的)例句:我的花园非常大。Mygardenisverybig.搭配:YellowStonePark黄石公园under/ˈʌndər/prep.在……下面(介词)tree/triː/n.树复数:tree......
  • 《现代操作系统》第4章读书笔记
    《现代操作系统》第4章读书笔记就像操作系统提取处理器的概念来建立进程的抽象,以及提取物理存储器的概念来建立进程地址空间的抽象那样,我们可以用一个新的抽象——文件来解决这些问题。进程、地址空间和文件,这些抽象概念均是操作系统中最重要的概念。文件是对磁盘的建模,而非对RA......
  • Elixir学习笔记——第一章
    本指南将向您介绍Elixir基础知识-语言语法、如何定义模块、语言中的常见数据结构等。本章将重点介绍如何确保安装了Elixir,以及您可以成功运行Elixir的交互式Shell(称为IEx)。安装如果您尚未安装Elixir,请访问我们的安装页面。完成后,您可以运行elixir--version以获......
  • linux进程和计划任务管理
    一、查看和控制进程程序是保存在外部存储介质(如硬盘)中的可执行机器代码和数据的静态集合,而进程是在 CPU 及内存中处于动态执行状态的计算机程序。在 Linux 操作系统中,每个程序启动后可以创建一个或多个进程。例如,提供 Web 服务的 httpd 程序,当有大量用户同时访问Web......