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

news/2024/11/14 11:53:20/

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

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分配的内存释放问题,因为新的程序会重新初始化其内存空间。


http://www.ppmy.cn/news/1467077.html

相关文章

【react】useEffect 快速上手

useEffect 快速上手 useEffect(setup, dependencies?) 可以接收两个参数&#xff0c;分别是回调函数与依赖数组. useEffect 用什么姿势来调用&#xff0c;本质上取决于你想用它来达成什么样的效果。下面我们来简单介绍 useEffect 的调用规则。 每一次渲染后都执行的副作用&a…

PDF 转 word (优化版)

PDF 转 word &#xff08;优化版&#xff09; 原文链接&#xff1a;url&#xff0c;针对原文做了一些优化&#xff0c;适配性更好 首先在pdf所在文件夹中创建pdf2word.py import os from pdf2docx import Converterdef pdf_docx():# 获取当前路径file_path os.getcwd()# 获取…

HTML静态网页成品作业(HTML+CSS)——游戏阴阳师介绍网页(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有4个页面。 二、作品演示 三、代…

华为OD机试 - 贪心歌手 - 动态规划(Java 2024 D卷 200分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测…

【Java面试】十二、Kafka相关

文章目录 1、Kafka如何保证消息不丢失1.1 生产者发消息到Brocker丢失&#xff1a;设置异步发送1.2 消息在Broker存储时丢失&#xff1a;发送确认机制1.3 消费者从Brocker接收消息丢失1.4 同步 异步组合提交偏移量 2、Kafka如何保证消费的顺序性3、Kafka高可用机制3.1 集群模式…

家庭组网介绍

光纤是光信号&#xff0c;网线是电信号&#xff0c;光猫一个 很重要的特点就是做光电转换 光猫也可能有wifi功能&#xff0c;否则要买路由器 有了这些设备还不一定能上网&#xff0c;需要买运营商的带宽服务&#xff0c;还需要买公网ip的使用权 通过NAT技术上网&#xff08;…

什么是人机协同翻译

什么是人机协同翻译 序什么是人机协同翻译账号绑定服务开通文档翻译图片翻译体验感受及建议 序 什么是人机协同翻译&#xff0c;为什么会需要人机协同翻译&#xff0c;以及人机协同翻译的效果&#xff0c;应用场景等&#xff0c;本文将关于这些内容一一解答。 什么是人机协同…

JVM学习笔记(持续更新)

JDK、JRE、JVM区别&#xff1f; 类加载过程 装载 验证 准备 解析 初始化 类加载器分类 双亲委派模型 如何打破双亲委派模型&#xff1f; 自定义类加载器&#xff0c;集成ClassLoader类重写loadClass,如Tomcat JVM内存模型 JVM 需要使用计算机的内存&#xff0c;Java 程序…