查看/proc/self/状态时,VMRSS或VMIZE的变化不一致
Inconsistent change in VmRSS or VmSize when looking at /proc/self/status
我一直在调查Red Hat Enterprise Linux 6上的客户。我在Ubuntu上也看到了类似的行为。客户正在通过输出来跟踪内存使用量/proc/self/status
使用特定的ODBC驱动程序时,这会在ODBC应用程序中发生,但我怀疑与问题有关。
在程序的各个阶段,正在跟踪内存使用情况(通过呼叫/proc/proc/self/status函数粘贴到结束时),一次在释放该内存后一次,一次在卸载内存之后,一次卸载后一次。动态库。
当分配的内存的数量超过一定值时,释放内存后,VMRS不会立即下降,但是在卸载SO文件后会立即下降。释放内存后,当分配的内存的数量为小VMRS时,立即下降。
我已经在应用程序上运行valgrind,我找不到任何内存泄漏。非常感谢任何帮助,解释,指示文章的指示。
void print_proc_status_vm()
{
std::ifstream proc_status_fhandle;
proc_status_fhandle.open("/proc/self/status");
std::string s;
int line=0;
static std::map<std::string, int> memoryUsage;
while(std::getline(proc_status_fhandle, s)){
++line;
if( (line >=12) and (line <=17 ) and (line !=14) )
{
char* str = new char[s.size()+1];
strcpy(str, s.c_str());
std::string key(strtok(str, "t "));
int value = atoi(strtok(NULL, "t "));
printf("%s %d n", key.c_str(), value - memoryUsage[key] );
memoryUsage[key] = value;
delete[] str;
}
}
}
一旦我遇到了Suricata的相似问题 - 该程序将加载到内存中很多小规则,一旦开发人员添加了动态的规则重新加载,该程序最终会不断占用两次即使在加载新的规则后,所有先前的规则都释放了,但同样多的内存。
是由一个事实引起的,有很多规则,每个规则一个malloc,但每个规则都没有太多空间=>内部使用的malloc brk/sbrk(类似堆栈),而不是mmap =>作为原始规则低于数据段的新规则,即使释放了原始规则的千兆字节,该部分也没有减少。
在这种情况下,解决方案是一次分配大量的内存,然后手动将其分成较小的零件。
关于文件,它是mmmpapped的,因此可以在将内存立即发布后立即释放。
相关文章:
- C++取消引用指针.为什么会发生变化
- 为什么在读取文件大小时文件IO速度会发生变化
- 为什么cudaMemGetInfo报告设备内存总量的变化
- 如何避免LED在循环状态变化中闪烁?
- 当 I2C 值在C++中发生变化时收到通知
- Gtkmm 会不断检查 Gtk::日历上的所选日期是否发生变化
- 当我调用对象的方法时,对象的成员会发生变化
- 为什么向量内部的指针在从函数返回时会发生变化?
- 如何在 c++ 中循环中使用频率变化的声音?
- 为什么 C++ 中的零会发生变化
- 为什么我的全局变量似乎没有变化?
- 使用 IMFSinkWriter 编码的视频的播放速度会根据宽度而变化
- C++11:具有互斥锁的线程看到原子变量的值发生变化,尽管这是唯一可以改变它的代码
- 为什么预减量会导致奇怪的变化?
- MATLAB:跟踪imufilter对象中的状态变化
- 当父小部件大小发生变化时,如何更改子小部件的大小?
- 我正在将一个 std::string 传递给一个 boost 函数,该函数对该类型进行常量引用,但该值发生了变化
- c++问题:给一个变量赋值后,另一个变量发生了变化
- 为什么使用默认构造函数"{}"而不是"= default"存在性能变化?
- 查看/proc/self/状态时,VMRSS或VMIZE的变化不一致