boost::property_tree退出作用域后内存未释放问题咨询
问题解析:Boost Property Tree销毁后内存未下降的原因
在Ubuntu 22.04系统上使用Boost 1.74版本的boost::property_tree解析约350kB的JSON文件,发现ptree退出作用域后,通过cat /proc/{PID}/status | grep RSS监控的驻留内存(VmRSS)并未下降。
代码示例
int main() { std::string path("../files/testFile.json"); sleep(2); try { boost::property_tree::ptree its_tree; boost::property_tree::json_parser::read_json(path, its_tree); its_tree.clear(); std::cout << "File was read" << std::endl; sleep(2); } catch (boost::property_tree::json_parser_error&) { std::cout << "Failed reading json" << std::endl; } std::cout << "Destroyed ptrees" << std::endl; sleep(10); return 0; }
内存监控数据
17:19:55: VmRSS: 3584 kB File was read 17:19:56: VmRSS: 5504 kB 17:19:57: VmRSS: 5504 kB Destroyed ptrees 17:19:58: VmRSS: 5504 kB 17:19:59: VmRSS: 5504 kB 17:20:00: VmRSS: 5504 kB
解答:这不是代码错误,是Linux内存管理机制导致的
你的代码没有问题,boost::property_tree::ptree的clear()方法和析构函数确实会释放其占用的堆内存,之所以VmRSS没有下降,是因为Linux内核不会在进程释放内存后立刻将内存回收给系统:
VmRSS(驻留集大小)统计的是进程当前实际占用的物理内存。当进程释放内存时,这块内存只是被标记为进程内部的空闲内存,内核会将其保留在进程的内存池中,供该进程后续的内存分配复用,而不是立刻归还给系统。- 这种设计是为了避免频繁申请/释放内存带来的性能开销,属于Linux内存管理的正常行为。
验证方式
如果想确认内存确实已经被释放,可以做以下测试:
- 在
ptree销毁后,尝试申请一块与之前JSON解析占用内存相当的内存块(比如用new char[2048*1024]),此时会发现VmRSS不会出现明显增长,因为进程会复用之前释放的空闲内存。 - 如果需要强制让内核回收空闲内存(一般不推荐,除非有特殊需求),可以调用glibc的
malloc_trim(0)函数(需要包含<malloc.h>),调用后再查看VmRSS,数值会明显下降。
总结:你的代码逻辑没有错误,内存已经被进程释放,只是Linux内核暂时没有回收而已。
内容的提问来源于stack exchange,提问作者user24121343
相关产品推荐
相关产品推荐

