程发生问题。应用程序的升级可采用两种方式:VIP Swap,需要多收费,In-place upgrade(逐步替代)。升级尽量细粒度,短期迭代,越快越好,减小失败的可能性,在云上,一次失败,可能早正所有的服务由于升级都不可用。
VC Debug Mode对内存泄露的追踪机制一/二
C++在高级语言当中,是唯一可以对内容自由管理的
语言,是由CRT来做的,而不是操作系统,正犹豫此,可能会带来memory leaks和写溢出的风险。在debug mode下,这些被应用程序申请的内容称之为debug heap。基于C++的开发程序,从高阶,如MFC, STL,到低阶C Runtime库,其对象的创建和内容的申请,最终都会归结到CRT的malloc调用。这里再来说malloc。
CRT中申请内存必须是16的倍数(为了管理的效率),最大1k,大于1k,交给操作
系统管理。这样CRT管理的内存块会有1024/16=64中不同的大小类型(16,32,48,..., 1K),CRT对这64不同大小的内存块使用了64个双向链表来管理。这些快都不大,称之为small block。malloc通过CRT申请内存的时候,在内存中需求稍大和相同大小的一个块,并放到对应链表上(当<1K时会采用这个策略)。
对内存的管理,不同的层次都要做,CRT会做(跨平台,不保证上层操作系统会做),操作系统会做,程序员就不需要做了,做了效率也不可能比它们高。上面说到CRT会为malloc申请一个稍大点的内存,具体膨胀策略如下:
0-int:cookie,值是该块的整体大小,可能为了对齐的缘故,以下各段扩展都是int类型,可以用来向上做内存整理。
1-int:pnext,指针,应用程序中debug heap用一个双向链表来维护所有数据。
2-int:pprev,指针,指向前一个内存区块。
3-int:szFileName,文件名
4-int:nline,在文件中的行数
5-int:ndatasize,是实际申请的数据块大小
6-int:nblockuse,块内存类型,一共五种:FREE_BLOCK(0),NORMAL_BLOCK(1),CRT_BLOCK(2),IGNORE_BLOCK(3),CLIENT_BLOCK(4)。
7-int:irequest,没有特别意义,请求的序号,CRT自己用的,流水号。
8-int:nomanslandsize
x-int:实际申请内存
y-int:x-byte,整个区块要求是16字节的倍数,这里补齐字节和int字段,可以用来做向下内存整理。
1-int:nomanslandsize,无人区,是4个0xfd,free之后,设置为0xfc,当对该块进行free操作是会检查,如不是oxfd,则发生过溢出操作,
我们知道了CRT会维护一个双向链表,同时每个链表的元素为上述结构,我们就不难理解,可以利用这个表做内存整理,可以在检查写溢出,同时,在程序结束时,检查nblockuse,如果除crt_block外,还有normal_block,则存在内存泄露。
CRT提供三个hook函数,用来
注册函数:
_CrtSetAllocHook()
_CrtSetDumpClient()
_CrtSetReportHook()
具体可以查MSDN, 也可在程序main函数退出时,进行遍历。讲师给了几个例子,已经拍照,可以作为样例参考实现,由于text
文档,不能粘贴图片,这里省略,仅作原理性说明。
客户案例分享 通过visual stdio 2010 ultimate发现和改进企业架构
在分层式架构中,当部署规模不大时,优势可以允许底层同层之间
允许访问。任务的分化必须根据设计原则,分层交互之间,要满足最小知识原则,能放在上层的,尽量放在上层模块来做。
分层模型,优势为了同系列产品的需要,我们将其修改为准备模型,每一层可以提供结构,或抽象为统一的服务,这样每一层都可以拿出去服务于同系列产品中的一种。在这里,跨层访问是不允许的,会破坏高可用性。如果各层都需要底层的一个服务模块,那么采用分层的横切机制,来满足此需求。
软件的开发,应该把运维也放进去,优势架构师,需要把目前的人力资源放到架构设计中去,包括运维工具。
构建企业中的用户体验