当前位置: 首页 > news >正文

营销型网站策划建设分为哪几个层次同城推广

营销型网站策划建设分为哪几个层次,同城推广,免费做淘宝联盟网站,wordpress 全局tag详情请看参考文章:.NET面试题解析(06)-GC与内存管理 - 不灬赖 - 博客园 (cnblogs.com)一、对象创建及生命周期一个对象的生命周期简单概括就是:创建>使用>释放,在.NET中一个对象的生命周期:new创建对象并分配内存对象初始化…

详情请看参考文章:.NET面试题解析(06)-GC与内存管理 - 不灬赖 - 博客园 (cnblogs.com)

一、对象创建及生命周期

一个对象的生命周期简单概括就是:创建>使用>释放,在.NET中一个对象的生命周期:

  • new创建对象并分配内存

  • 对象初始化

  • 对象操作、使用

  • 资源清理(非托管资源)

  • GC垃圾回收

GC的内存管理的目标主要都是引用类型对象,引用对象都是分配在托管堆上的,托管堆中的对象是顺序存放的,托管堆维护着一个指针NextObjPtr,它指向下一个对象在堆中的分配位置。 托管堆的基本结构,如下图:

以下题代码为例,模拟一个对象的创建过程:

public class User
{public int Age { get; set; }public string Name { get; set; }public string _Name = "123" + "abc";public List<string> _Names;
}

它的的创建工作原理如下

  • 对象大小估算,共计40个字节

  • 属性Age值类型Int,4字节;

  • 属性Name,引用类型,初始为NULL,4个字节,指向空地址;

  • 字段_Name初始赋值了,代码会被编译器优化为_Name=”123abc”。一个字符两个字节,字符串占用2×6+8(附加成员:4字节TypeHandle地址,4字节同步索引块)=20字节,总共内存大小=字符串对象20字节+_Name指向字符串的内存地址4字节=24字节;

  • 引用类型字段List<string> _Names初始默认为NULL,4个字节;

  • User对象的初始附加成员(4字节TypeHandle地址,4字节同步索引块)8个字节;

  • 内存申请:申请44个字节的内存块,从指针NextObjPtr开始验证,空间是否足够,若不够则触发垃圾回收。

  • 内存分配:从指针NextObjPtr处开始划分44个字节内存块。

  • 对象初始化:首先初始化对象附加成员,再调用User对象的构造函数,对成员初始化,值类型默认初始为0,引用类型默认初始化为NULL;

  • 托管堆指针后移:指针NextObjPtr后移44个字节。

  • 返回内存地址:返回对象的内存地址给引用变量。

二、GC垃圾回收

GC是垃圾回收(Garbage Collect)的缩写,是.NET核心机制的重要部分。她的基本工作原理就是遍历托管堆中的对象,标记哪些被使用对象(那些没人使用的就是所谓的垃圾),然后把可达对象转移到一个连续的地址空间(也叫压缩),其余的所有没用的对象内存被回收掉。

首先,需要再次强调一下托管堆内存的结构,如下图,很明确的表明了,只有GC堆才是GC的管辖区域。GC堆里面为了提高内存管理效率等因素,有分成多个部分,其中 两个主要部分:

  • 0/1/2代:代龄(Generation);

  • 大对象堆(Large Object Heap),大于85000字节的大对象会分配到这个区域,这个区域的主要特点就是:不会轻易被回收;就是回收了也不会被压缩(因为对象太大,移动复制的成本太高了);

什么是垃圾?简单理解就是没有被引用的对象。

垃圾回收的基本流程包含以下三个关键步骤:

① 标记

先假设所有对象都是垃圾,根据应用程序根指针Root遍历堆上的每一个引用对象,生成可达对象图,对于还在使用的对象(可达对象)进行标记(其实就是在对象同步索引块中开启一个标示位)。

其中Root根指针保存了当前所有需要使用的对象引用,他其实只是一个统称,意思就是这些对象当前还在使用,主要包含:静态对象/静态字段的引用;线程栈引用(局部变量、方法参数、栈帧);任何引用对象的CPU寄存器;根引用对象中引用的对象;GC Handle table;Freachable队列等。

② 清除

针对所有不可达对象进行清除操作,针对普通对象直接回收内存,而对于实现了终结器的对象(实现了析构函数的对象)需要单独回收处理。清除之后,内存就会变得不连续了,就是步骤3的工作了。

③ 压缩

把剩下的对象转移到一个连续的内存,因为这些对象地址变了,还需要把那些Root跟指针的地址修改为移动后的新地址。

垃圾回收的过程示意图如下:

垃圾回收的过程是不是还挺辛苦的,因此建议不要随意手动调用垃圾回收GC.Collect(),GC会选择合适的时机、合适的方式进行内存回收的。

非托管资源回收

.NET中提供释放非托管资源的方式主要是:Finalize() 和 Dispose()。

Dispose():

Dispose需要手动调用,在.NET中有两种调用方式:

//方式1:显示接口调用
SomeType st1=new SomeType();
//do sth
st1.Dispose();//方式2:using()语法调用,自动执行Dispose接口
using (var st2 = new SomeType())
{//do sth
}

第一种方式,显示调用,缺点显而易见,如果程序猿忘了调用接口,则会造成资源得不到释放。或者调用前出现异常,当然这一点可以使用try…finally避免。

一般都建议使用第二种实现方式,他可以保证无论如何Dispose接口都可以得到调用,原理其实很简单,using()的IL代码如下图,因为using只是一种语法形式,本质上还是try…finally的结构。

Finalize() :终结器(析构函数)

首先了解下Finalize方法的来源,她是来自System.Object中受保护的虚方法Finalize,无法被子类显示重写,也无法显示调用,是不是有点怪?。她的作用就是用来释放非托管资源,由GC来执行回收,因此可以保证非托管资源可以被释放。

简单总结一下:Finalize()可以确保非托管资源会被释放,但需要很多额外的工作(比如终结对象特殊管理),而且GC需要执行两次才会真正释放资源。听上去好像缺点很多,她唯一的优点就是不需要显示调用。

有些编程意见或程序猿不建议大家使用Finalize,尽量使用Dispose代替,我觉得可能主要原因在于:第一是Finalize本身性能并不好;其次很多人搞不清楚Finalize的原理,可能会滥用,导致内存泄露。因此就干脆别用了,其实微软是推荐大家使用的,不过是和Dispose一起使用,同时实现IDisposable接口和Finalize(析构函数),其实FCL中很多类库都是这样实现的
这样可以兼具两者的优点:
如果调用了Dispose,则可以忽略对象的终结器,对象一次就回收了;
如果程序猿忘了调用Dispose,则还有一层保障,GC会负责对象资源的释放;

三、性能优化建议

尽量不要手动执行垃圾回收的方法:GC.Collect()

垃圾回收的运行成本较高(涉及到了对象块的移动、遍历找到不再被使用的对象、很多状态变量的设置以及Finalize方法的调用等等),对性能影响也较大,因此我们在编写程序时,应该避免不必要的内存分配,也尽量减少或避免使用GC.Collect()来执行垃圾回收,一般GC会在最适合的时间进行垃圾回收。

而且还需要注意的一点,在执行垃圾回收的时候,所有线程都是要被挂起的(如果回收的时候,代码还在执行,那对象状态就不稳定了,也没办法回收了)。

推荐Dispose代替Finalize

如果你了解GC内存管理以及Finalize的原理,可以同时使用Dispose和Finalize双保险,否则尽量使用Dispose。

选择合适的垃圾回收机制:工作站模式、服务器模式

个人学习总结:

首先了解对象的创建及生命周期

  • new创建对象并分配内存

  • 对象初始化

  • 对象操作、使用

  • 资源清理(非托管资源)

  • GC垃圾回收

其次了解分配到托管堆的基本流程

对象大小估算

内存申请

内存分配

对象初始化

托管堆指针后移

返回内存地址

然后GC的基本工作原理就是遍历托管堆内的所有的引用对象,标记被使用过的对象(也叫可达对象),然后清除不可达对象(清除之后内存变得不再连续),然后把可达对象转移到一个连续的地址空间(也叫压缩)

最后关于GC的一些接口建议:

尽量不要手动执行垃圾回收的方法:GC.Collect()

推荐Dispose代替Finalize

如果你了解GC内存管理以及Finalize的原理,可以同时使用Dispose和Finalize双保险,否则尽量使用Dispose。

http://www.fp688.cn/news/153290.html

相关文章:

  • 修改网站logo外贸seo软件
  • 深圳专业o2o网站设计公司网站推广优化排名
  • 做电商哪几个设计网站比较好把百度网址大全设为首页
  • 国内互动网站建设网站seo推广公司靠谱吗
  • 网站安全防黑联盟公司的网站
  • 调整百度对网站的最大天级抓取频次值seo优化排名价格
  • 医院病房建设网站营销策略有哪些方法
  • 沈阳做微网站的公司建设网站的十个步骤
  • 无锡模板网站设计公司跨境电商怎么开店铺
  • w78企业网站后台怎么做信息流推广的竞价机制是
  • 网站管理后台下载做网站的平台有哪些
  • 哈尔滨网站建设哪家有谷歌优化教程
  • 服装网站建设费用南京seo网站优化推广
  • 做防水怎么注册网站seminar
  • 怎么制作网站设计广州百度竞价托管
  • 网站建设与管理论文公司的网站制作
  • 镇江网站排名优化价格创建网站的公司
  • 一款蛋糕食品类企业手机网站源码站长统计官网
  • 建设企业功能型网站微信5000人接推广费用
  • mysql php wordpressseo文案范例
  • wordpress 手机 注册seo研究中心怎么样
  • 网站策划书 范文代运营套餐价格表
  • 不想网站备案如何办seo案例模板
  • wordpress阅读插件北京整站线上推广优化
  • 二级网站排名做不上去包头seo
  • 网站app怎么制作教程南京高端品牌网站建设
  • 泉州公司建站模板seo网址
  • 计算机网络技术网站开发资源优化排名网站
  • php网站上做微信支付功能ueeshop建站费用
  • 济南建站公司价格杭州百度推广优化排名