思考垃圾回收期的代码编写
了解了垃圾回收器的工作方式后,就知道了如何会使垃圾回收器变慢。使垃圾回收器变慢的最常见原因是由于分配了太多东西。每次遍历的根越多,回收就会越慢。这时,甚至部分回收也不会节约时间,尤其是在代0对象中大量存在分配的时候。因此在编写代码是要心中有数,将要进行多少分配。创建数组经常会生成不少可有可无的分配,使代码情况而定。
记住,垃圾回收器需要先遍历根来找出未使用的对象。需要检查的根越多,回收器需要的时间就越多。如果创建了一个很大的结构,并包含大量引用(即指针),这样每一次运行回收时,回收器就需要检查每一个引用来判断哪些对象是获得,哪些对象已经死亡。
对于带有大量指针的大型结构,或需要垃圾回收器花费大量时间检查的某些结构,如果这种结构的生存期很长,那么可以使用完全回收。而如果这种大型结构生存期较短,不断回收铜一个结构就会使垃圾回收器变慢,从而使程序也变慢。(这可是很关键的哦)
如果方法中有很多对象指针,那么就要避免这些方法的深度递归。这种方法会生成大量的根(记住,跟就是堆栈变量以及全局对象指针),G0回收时需要处理这些跟。程序员往往会注意到,深度递归方法的执行时间很长,这是因为垃圾回收器要不断试着维持根分配。
如何使根数目减少,如何使G1的尺寸不回快速扩大呢?下面是Microsoft的几条准则:
- 只分配需要的对象,而且只在需要时进行分配。
- 在创建长生存期对象是,使对象的尺寸尽可能小。
- 使堆栈中的对象指针尽可能少
编写代码时尽可能做到:通过分析其运行代码,来显示垃圾回收器的活动;采用之前的建议,使代码对垃圾回收器更为友好。
请继续关注我的Blog,我们将会继续关注.net中的“非确定性终结和析构”、“CLR内存管理”、“装箱和拆箱”、“各种结构的IL代码实现以及性能问题”……有任何疑问或者建议,欢迎留言回复。