Protobuf 在VC下的内存泄漏

  在MFC程序中使用了protobuf的静态库,结果发现程序退出时报告内存泄漏。

  在程序退出前加入下面这句即可解决:  google::protobuf::ShutdownProtobufLibrary();

  c++中使用google protobuf在关闭应用程序之前需要调用google::protobuf::ShutdownProtobufLibrary();要不然会有内存泄露。

其实这样也会同样存在内存泄露的问题。

下面是Google给出的建议原文翻译:

性能提示
在性能上,我们还可以做一些额外的工作,使得 Protocol Buffers 更加高效,其中关键的一个问题就是内存管理。
我们可以尽量的复用 Protocol Buffers message 类,我们对 message 进行了 clear 之后,message 的内存并不会被释放而可以直接重新使用(也就避免了再次分配内存的开销)。message 的内存的使用情况可以通过函数 SpaceUsed 获取。
另外,你也可以尝试使用其他的内存分配器,例如 Google’s tcmalloc,它对多线程中分配大量小对象有很好的优化。

protocol buffer 推荐循环,重复使用,但是由于每次放入的东西内容大小不一致,导致内存泄露,所以需要动态监测protocol buffer的大小,动态删除。

另外,当嵌套使用protocol buffer时,推荐递归clear。

当大量进行malloc,free操作时会出现内存碎片和加重cpu的负载,关于这一方面的问题,且听下回分解。

 

protobuf的cache机制

 

protobuf message的clear()操作是存在cache机制的,它并不会释放申请的空间,这导致占用的空间越来越大。如果程序中protobuf message占用的空间变化很大,那么最好每次或定期进行清理。这样可以避免内存不断的上涨。这也是模块内存一直上涨的核心问题。

 

内存监控机制

 

需要对程序的各个模块添加合适的监控机制,这样当某个module的内存占用增加时,我们可以及时发现细节的问题,而不用从头排查。根据这次的排查经验,后面会主导在产品代码中添加线程/module级内存和cpu处理时间的监控,将监控再往”下”做一层。

 

UT在内存问题定位中的作用

 

在逐个对module进行排查时,UT验证比在测试环境中更高效,当然前提是这些module的UT能够比较容易的写出来。这也是使用先进框架的一个原因。对于验证环境代价高昂的模块,UT验证的效果更加明显。

posted @ 2018-05-22 13:17  傍风无意  阅读(1799)  评论(0)    收藏  举报