思考垃圾回收期的代码编写

       到目前为止已经简单介绍了垃圾回收器的工作方式,试想一下,如何编写自己的代码但不会是垃圾回收器变慢。现在有很多书都是关于CLR以及实现代码的,包括垃圾回收器,所以接下来的该书中将会讨论如何在代码中避免常见的垃圾回收器缺陷。

        了解了垃圾回收器的工作方式后,就知道了如何会使垃圾回收器变慢。使垃圾回收器变慢的最常见原因是由于分配了太多东西。每次遍历的根越多,回收就会越慢。这时,甚至部分回收也不会节约时间,尤其是在代0对象中大量存在分配的时候。因此在编写代码是要心中有数,将要进行多少分配。创建数组经常会生成不少可有可无的分配,使代码情况而定。

        记住,垃圾回收器需要先遍历根来找出未使用的对象。需要检查的根越多,回收器需要的时间就越多。如果创建了一个很大的结构,并包含大量引用(即指针),这样每一次运行回收时,回收器就需要检查每一个引用来判断哪些对象是获得,哪些对象已经死亡。

        对于带有大量指针的大型结构,或需要垃圾回收器花费大量时间检查的某些结构,如果这种结构的生存期很长,那么可以使用完全回收。而如果这种大型结构生存期较短,不断回收铜一个结构就会使垃圾回收器变慢,从而使程序也变慢。(这可是很关键的哦)

        如果方法中有很多对象指针,那么就要避免这些方法的深度递归。这种方法会生成大量的根(记住,跟就是堆栈变量以及全局对象指针),G0回收时需要处理这些跟。程序员往往会注意到,深度递归方法的执行时间很长,这是因为垃圾回收器要不断试着维持根分配。

        如何使根数目减少,如何使G1的尺寸不回快速扩大呢?下面是Microsoft的几条准则:

  • 只分配需要的对象,而且只在需要时进行分配。
  • 在创建长生存期对象是,使对象的尺寸尽可能小。
  • 使堆栈中的对象指针尽可能少

        编写代码时尽可能做到:通过分析其运行代码,来显示垃圾回收器的活动;采用之前的建议,使代码对垃圾回收器更为友好。

 

        请继续关注我的Blog,我们将会继续关注.net中的“非确定性终结和析构”、“CLR内存管理”、“装箱和拆箱”、“各种结构的IL代码实现以及性能问题”……有任何疑问或者建议,欢迎留言回复。

posted @ 2006-08-04 17:33  随风而逝  阅读(151)  评论(0编辑  收藏  举报