`
ouyida3
  • 浏览: 47875 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

在linux上替换动态库的内存变化分析

阅读更多

在linux上替换动态库的内存变化


测试static变量:
static string staticString = "123";
void queryFreezingMoney(CFmlBuf& inBuf, CFmlBuf& outBuf)
{
    string in = GetString(inBuf,"SEND_CODE");
    if (in == "1")
    {
    staticString = GetString(inBuf,"SEND_DESC");
    }
    else
    {
    outBuf.SetString("OPER_DESC",staticString);
    }
}

当send_code传入非1时,可以传入send_desc修改staticString的值,假设修改为"456"后,每次查询OPER_DESC的返回都是新的值"456"。证明static起作用。

然后,重新替换so动态库(queryFreezingMoney函数编译在动态库中),替换后和替换前的动态库中代码是完全一样,此时再调用,OPER_DESC返回"123"。证明替换动态库,即使不重启程序,也会使得全局数据区的内存重新加载。

单例和static有点相似,他们在内存区一样吗?
不一样。单例是new创建的,它在堆区;static在上一篇文章说了,在全局数据区。

所以,接着我们需要测试,替换了动态库,堆区的内存是如何变化的。

ArchQuery.h
class ArchQuery
{
public:
    static string singletonString;
};

ArchQuery.cpp
string ArchQuery::singletonString = "abc";


ArchQueryMgr.cpp
typedef Singleton<archquery::ArchQuery> ArchQueryHolder;
void queryFreezingMoney(CFmlBuf& inBuf, CFmlBuf& outBuf)
{
    string in = GetString(inBuf,"SEND_CODE");
    if (in == "1")
    {
    ArchQueryHolder::getInstance().singletonString = GetString(inBuf,"SEND_DESC");
    }
    else
    {
    outBuf.SetString("OPER_DESC",ArchQueryHolder::getInstance().singletonString);
    }
}

结论同上。
singletonString初始化为abc,可以修改为def,替换动态库后,又重新变为abc。


最后,测试单例非static变量:
ArchQuery.h
class ArchQuery
{
public:
    string singletonString;
    void setSingletonString(string str)
    {
    singletonString = str;
    }
};

ArchQueryMgr.cpp
typedef Singleton<archquery::ArchQuery> ArchQueryHolder;
void queryFreezingMoney(CFmlBuf& inBuf, CFmlBuf& outBuf)
{
    string in = GetString(inBuf,"SEND_CODE");
    if (in == "1")
    {
    ArchQueryHolder::getInstance().setSingletonString(GetString(inBuf,"SEND_DESC"));
    }
    else
    {
    outBuf.SetString("OPER_DESC",ArchQueryHolder::getInstance().singletonString);
    }
}

singletonString没有初始化值,可以通过传入SEND_DESC首先把singletonString的值设为def,替换动态库后,值依然为def!
结论,替换动态库并不能使堆区的内存变化。

总结:
1 一般的static变量,替换了动态库会重新加载
2 如果是单例的static变量,替换了动态库会重新加载
3 如果是单例的非static变量,替换了动态库不会重新加载



===================
附录:

环境:
Red Hat Enterprise Linux Server release 6.3 (Santiago)
Kernel 2.6.32-279.el6.x86_64 on an x86_64

编译器 :
Using built-in specs.
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC)


顺带说一下,这个问题在aix上是都会重新加载的。所以两个平台迁移的时候要注意了。

AIX Version 5.3
aix编译器:
  xlC.adt.include            9.0.0.0    C     F    C Set ++ Application
  xlC.aix50.rte             10.1.0.3    C     F    XL C/C++ Runtime for AIX 5.3
  xlC.cpp                    9.0.0.0    C     F    C for AIX Preprocessor
  xlC.msg.ZH_CN.cpp          9.0.0.0    C     F    C for AIX Preprocessor
  xlC.msg.en_US.cpp          9.0.0.0    C     F    C for AIX Preprocessor
  xlC.msg.en_US.rte         10.1.0.3    C     F    XL C/C++ Runtime
  xlC.msg.zh_CN.cpp          9.0.0.0    C     F    C for AIX Preprocessor
  xlC.rte                   10.1.0.3    C     F    XL C/C++ Runtime

===============

再附两个报错信息:

static string singletonString;// 注意,这里不能初始化,否则会报错
报错:
ArchQuery.h:15: error: invalid in-class initialization of static data member of non-integral type 'std::string'

然后ArchQuery.cpp必须定义:
string ArchQuery::singletonString;

否则会报错。

分享到:
评论

相关推荐

    内存管理内存管理内存管理

    在 32-位 x86 系统上,每一个进程可以访问 4 GB 内存。现在,大部分人的系统上并没有 4 GB 内存,即使您将 swap 也算上,每个进程所使用的内存也肯定少于 4 GB。因此,当加载一个进程时,它会得到一个取决于某个...

    操作系统(内存管理)

    文将对 Linux™ 程序员可以使用的内存管理技术进行概述,虽然关注的重点是 C 语言,但同样也适用于其他语言。文中将为您提供如何管理内存的细节,然后将进一步展示如何手工管理内存,如何使用引用计数或者内存池来半...

    链接器和加载器.PDF(链接器和加载器 Beta 2)

    内容包括链接和加载、体系结构、目标文件、存储分配、符号管理、库、重定位、加载和覆盖、共享库、动态链接和加载、动态链接的共享库,以及着眼于成熟的现代链接器所做的一些变化;并介绍一个持续的实践项目,即使用...

    flash shiti

    2.选定舞台上的元素,并将选定元素拖到库面板上 3.填写Convert to Symbol 对话框,并点击确定" 10. 某电影中,只有一个layer1,其上放置一个有两个元件(test1 和test2)组合成的组合体, 选择这个组合体执行打散Ctrl...

    Python Cookbook

    8.2 在Linux上测量内存使用 317 8.3 调试垃圾回收进程 318 8.4 捕获和记录异常 320 8.5 在调试模式中跟踪表达式和注释 322 8.6 从traceback中获得更多信息 324 8.7 当未捕获异常发生时自动启用调试器 327 8.8 ...

    IIS6.0 IIS,互联网信息服务

    除了匿名访问用户(Anonymous)外,IIS中的FTP将使用Windows 2000自带的用户库(可在“开始→程序→管理工具→计算机管理”中找到“用户”一项来进行用户库的管理)。 最后,关键一步还有就是将你的电脑变为网络中的...

    JAVA上百实例源码以及开源项目

    (1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    Java是一门各方面性能都很好的编程语言,它的基本特点是简单、面向对象、分布式、解释的、健壮的、安全的、结构中立的、可移植的、性能很优异的、多线程的、动态的,特别适合在Internet环境上开发的应用系统。...

    基于J2EE框架的个人博客系统项目毕业设计论...

    Java是一门各方面性能都很好的编程语言,它的基本特点是简单、面向对象、分布式、解释的、健壮的、安全的、结构中立的、可移植的、性能很优异的、多线程的、动态的,特别适合在Internet环境上开发的应用系统。...

    PHP程序开发范例宝典III

    实例055 带颜色变化的动态链接按钮 82 实例056 设置图片的样式 83 实例057 设置表格的样式 84 实例058 模拟的进度条 86 3.3 超链接样式 87 实例059 鼠标单击文字超链接样式 87 实例060 鼠标滑过图片...

    JAVA上百实例源码以及开源项目源代码

    (1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    Sqlite 一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中 W3C 万维网联盟,创建于1994年,是Web技术领域最具权威和影响力的国际中立性技术标准机构。主要的工作是发展 Web 规范,...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    linux 代码控制 自动化代码检查 sonar 代码规范 阿里巴巴Java开发规范手册 UMPAY——编码规范 日志规范 异常规范 网络 协议 TCP/IP HTTP hession file HTTPS 负载均衡 容器 JBOSS tomcat resin...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    注:本系列图书的第I、II卷再版时均相应改名为《xxx开发实例大全》(基础卷)及(提高卷),但内容基本无变化,需要的童鞋可自由匹配查找。 内容简介  《PHP开发实战1200例》分为I、II两卷共计1200个例子,包括了开发...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    注:本系列图书的第I、II卷再版时均相应改名为《xxx开发实例大全》(基础卷)及(提高卷),但内容基本无变化,需要的童鞋可自由匹配查找。 内容简介  《PHP开发实战1200例》分为I、II两卷共计1200个例子,包括了开发...

    网管教程 从入门到精通软件篇.txt

    如果在本次会话期间磁盘配置发生变化,为获得更新的扫描,必须先重新启动计算机,然后再次扫描磁盘。  bootcfg /list 列出引导列表中已有的条目。  bootcfg /disableredirect 在启动引导程序中禁用重定向。  ...

Global site tag (gtag.js) - Google Analytics