我正在一个docker容器中编写和测试一个cpp程序。我没有指定容器的最大内存大小。
docker run -it xxx:latest /bin/bash
并且cpp程序有时会导致内存泄漏,比如没有释放已分配的堆内存。所以我很好奇,如果内存泄漏将消失在主机linux当我杀死容器?还是这个容器中的程序导致的内存泄漏仍然存在于主机中?
omhiaaxx1#
Docker容器是单个进程的 Package 器,删除容器也会删除该进程;相反,如果进程自行退出,则会导致容器也退出。结束一个进程将释放进程使用的所有内存。因此,如果你有一个C++程序,并且它调用new而没有相应的delete,它将泄漏内存,但是结束进程将回收进程的所有内存,甚至是应用程序丢失的空间。如果进程在容器中运行,同样的规则仍然适用。这也适用于其他类似泄漏的行为和其他语言;例如,将大量的值附加到一个列表中,然后忽略它们,因此它们仍然不必要地“在使用中”。一些其他操作系统资源,如文件描述符,可以通过这种方式清理,但有些则不能。特别是,如果您fork(2)一个子进程,你必须在它之后自己清理。类似地,如果你有权访问Docker API,你必须清理你自己生成的任何相关容器。
new
delete
1条答案
按热度按时间omhiaaxx1#
Docker容器是单个进程的 Package 器,删除容器也会删除该进程;相反,如果进程自行退出,则会导致容器也退出。
结束一个进程将释放进程使用的所有内存。因此,如果你有一个C++程序,并且它调用
new
而没有相应的delete
,它将泄漏内存,但是结束进程将回收进程的所有内存,甚至是应用程序丢失的空间。如果进程在容器中运行,同样的规则仍然适用。这也适用于其他类似泄漏的行为和其他语言;例如,将大量的值附加到一个列表中,然后忽略它们,因此它们仍然不必要地“在使用中”。一些其他操作系统资源,如文件描述符,可以通过这种方式清理,但有些则不能。特别是,如果您fork(2)一个子进程,你必须在它之后自己清理。类似地,如果你有权访问Docker API,你必须清理你自己生成的任何相关容器。