技术标签: 内存释放 unordered_map 计算机程序原理 STL map
最近遇到一个特别占内存的需求。使用STL map/unordered_map,内存无法得到正确释放。再次响应请求,会出现内存溢出的情况。
[6453149.107435] Memory cgroup out of memory: Kill process 54949 (******) score 1001 or sacrifice child
[6453149.117193] Killed process 54779 (******) total-vm:106091668kB, anon-rss:104842716kB, file-rss:1088kB
我们知道,STL容器调用clear()方法,通常只是使得容器内部的对象通通析构,但容器本身的内存无法得到释放。即篮子里面东西拿走了,篮子占的空间还在,这样是为了方便下次存放新的对象时,不需要再次申请空间。
其他同学的blog中有很多例子,即clear()后,容器的size为0,但capacity不变,链接。
vector<int> vec(10000,-1);
vector<int>().swap(vec);
但是这种方法只对vector, string这两个容器有效,这里有大牛的解释;
对于map,set,unordered_map等容器,调用clear(), swap()都无法使得内存真正释放。虽然很多地方谈到,这一现象(内存被保留下来)是正常的,并不需要担心。但是当大量使用堆内存存放不同的数据结构,会造成严重的内存碎片从而导致内存泄漏问题。
一段简单的代码看一下:
#include <iostream>
#include <map>
using namespace std;
void func()
{
map<string,string> mp;
int i = 5000000;
while(i--)
mp.insert(make_pair(to_string(i),string("hell000o")));
map<string,string>().swap(mp);
}
int main()
{
func();
cout <<"done."<<endl;
while(1);
}
持续使用top观察内存,发现内存一直持续为最后的峰值。
只需添加一行,malloc_trim(0); 这一行代码会将空闲的堆内存归还给操作系统,供其他进程使用。
#include <iostream>
#include <map>
#include <malloc.h>
using namespace std;
void func()
{
map<string,string> mp;
int i = 5000000;
while(i--)
mp.insert(make_pair(to_string(i),string("hell000o")));
map<string,string>().swap(mp);
}
int main()
{
func();
cout <<"done."<<endl;
malloc_trim(0);
while(1);
}
文章浏览阅读8.3w次,点赞167次,收藏1.1k次。Vue基础教程系列,打造精品专栏。_vue
文章浏览阅读1.8k次。SEO(Search Engine Optimization)是指通过优化网站的内容、结构和技术,提高网站在搜索引擎中的排名,从而增加网站的曝光度和流量。_前端seo
文章浏览阅读8.4k次,点赞17次,收藏89次。一、软链接:又被叫为符号链接,它包含了到原文件的路径信息。创建软链接:ln -s file link二、硬链接:是对原文件起了一个别名。创建硬链接:ln file link1.本质:硬链接:本质是同一个文件软链接:本质不是同一个文件2.跨设备硬链接:不支持软链接:支持3.inode硬链接:相同软链接:不同4.链接数硬链接:创建新的硬链接,链接数会增加,删除硬链接,链接数减少软链接:创建或删除,链接数不会变化5.文件夹硬链接:不支持软链接_软链接和硬链接区别
文章浏览阅读1.8k次。在这里只做简单的一个括号匹配的问题其实思想都是一样的,若碰到左的,都入栈,右的,且原来的栈不为空,则拿出来进行匹配,成功了则继续往下做,否则,直接跳出循环。在这里为了省略起见,用了stl#include#include#include#includeusing namespace std;int main() { int i, j, k, n, m; char s[100_js 栈 多层成对括号
文章浏览阅读9.5k次,点赞4次,收藏47次。习题2部分答案2-3①先来先服务算法②最短作业优先算法③最短作业优先算法④最短剩余时间优先算法⑤抢占式优先数算法⑥时间片轮转算法(每个作业获得2min长的时间片)⑦最高响应比优先算法2-35个批处理作业A~E到达系统的时间、需要运行的时间及各自的优先级如下表所示,分别采用先来先服务算法、最短作业优先算法、最短作业优先算法、最短剩余时间优先算法、抢占式优先数算法、时间片轮转算法(每个作业获得2m..._操作系统原理与linux申丰山课后答案
文章浏览阅读364次。从0开始学管理:专注科学系统提升管理能力:基础 中层 高层 综合管理销售部SWOT分析报告:一、什么是SWOT分析?二、SWOT分析模式三、SWOT分析法的规则四、SWOT分析步骤一、什么是SWOT分析1、优势2、劣势3、机会4、威胁SWOT分析法:是用来确定企业自身的竞争优势、竞争劣势、机会和威胁,从而将公司的战略与公司内部资源、外部环境有机地结合起来的一种科学的分析方法。即基于内外部竞争环境和..._旷视波特五力模型
文章浏览阅读458次。多元回归预测 | Matlab主成分分析PCA降维,BP神经网络回归预测。PCA-BP回归预测模型_bp多元回归预测模型
文章浏览阅读1.4k次。Sun的桌面Java客户端组正在为下一版Java(代码名"野马")的某些重要特性和功能而工作;我们认为在此细说其中的某些亮点也许对您有所帮助。我们尽量给附加信息添加链接(如Bug ID或其它文章)并且在开发进程中告诉你每项特性添加到“野马”中的构建号的信息。并且随着野马的发布,这不仅只是说说而已,你可以随时从 http://mustang.dev.java.net下载到野马的最近版本。在此我们尽量_access野马
文章浏览阅读160次。本文摘自《深入理解Java虚拟机 第三版》,如此书的作者所说,虽然现在已经有个各种可视化工具实现了对命令行工具的封装,方便且体验良好。但是不论JDK发展到什么版本,或者工具如何封装,这些底层实现的基本思想都不会过时,都值得广大开发人员学习。1 基础工具:用于支持基本的程序创建和运行名称主要作用appletviewer在不适用web浏览器的情况下运行和调试Applet ,JDK11中被移除excheck检查jar冲突的工具,JDK9中被移除jar创建和管理jar文件_基础工具总结
文章浏览阅读3.1k次。作者丨ZiyangLi编辑丨极市平台导读卷积神经网络(CNN)目前在医学图像分割领域应用广泛。本文基于胶囊网络,设计了一种包含卷积与胶囊编码器的3DUNet架构并应用于医学图像分割,在减少推理时间的同时性能远优于以往UNet类架构。论文地址:https://arxiv.org/abs/2205.09299一、为什么要引入胶囊网络(Capsule Network)?..._icpr 2022 papers
文章浏览阅读6.2k次,点赞2次,收藏20次。UE4官方视频学习笔记——LOD与合并静态网格体大纲如下:UE4LOD自动创建工具LOD自动创建工具选择一个静态网格体,打开静态网格编辑器,并在细节面板中找到LOD Settings分组:该分组中有一个属性“LOD Group”:该属性中预存了许多类型的分组,比如Foliage、HighDetail等,当你选择其中一个的时候,UE4将会读取BaseEngine.ini中的配置数据,并按照预设好的配置为该静态网格体生成指定规格的LOD数据:手动修改LOD参数假如我们应用了Larg_ue的lod功能
文章浏览阅读972次,点赞21次,收藏26次。[TOC]本次教程我们来实现如何在外公网环境下,SSH远程连接家里/公司的Linux CentOS服务器,无需公网IP,也不需要设置路由器。_如何ssh到一个非固定ip的linux