- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
有一个与此类似的问题,但没有针对 linux 系统的静态、const 数据(只读数据)的答案。是这样的情况:系统上的许多程序正在使用共享库。那个共享库有大量的常量数据。对于链接到(和使用)共享库的每个进程,该 const 数据是否会在系统内存中复制?我理解(或者我认为)共享库的大小在“高”级别上被计算在内,但是 在幕后 Linux 不会换出可执行部分的重复拷贝。对于静态(命名空间级别)const 数据也是如此吗?
最佳答案
如果共享对象 libNNN.so
在只读段中有数据(例如来自 .rodata
或 .text
部分),那么该段是mmap - 通过 dlopen
或 ld.so
使用 MAP_SHARED
编辑,所以不同的进程(加载 libNNN.so
)使用它只读数据确实共享包含它的物理 RAM。
静态或全局读写数据进入MAP_PRIVATE
读写mmap
段(来自.bss
或.data
部分)所以每个进程都有自己的(仍然是写时复制)。
使用 objdump
找出 libNNN.so
中有哪些段
使用pmap
或/proc/1234/maps
了解pid 1234进程的内存映射。(从应用程序内部,顺序读取/proc/self/maps
如果需要,或者 /proc/self/statm
如果你想测量)。
请注意,C 中的 const
内容通常进入 .rodata
,但对于 C++ 构造的数据,情况不再如此
关于c++ - 共享库 (libNNN.so) 是否/应该共享常量数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9592399/
有一个与此类似的问题,但没有针对 linux 系统的静态、const 数据(只读数据)的答案。是这样的情况:系统上的许多程序正在使用共享库。那个共享库有大量的常量数据。对于链接到(和使用)共享库的每个
我是一名优秀的程序员,十分优秀!