C#笔记 垃圾回收garbage collection
来源:互联网 发布:互联网公平台用java 编辑:程序博客网 时间:2024/06/06 09:12
托管堆(managed heap)
托管堆指的是c#创建引用类型变量的内存。会定时使用垃圾回收(Garbage Collect)机制来释放不需要的内存,有必要的时候堆大小是会改变的。回收过程和改变大小会引起变量在内存里位置的变化(所以对于引用类型c#不提供指针。同时也要注意引用类型中的值类型成员的指针使用)。
如果想要利用好这个自动管理机制,要避免对不需要的内存保留引用,否则内存不会被回收。内存也就浪费了。
对象的分配:new 和 Instantiate(Unity常用的一个操作,其实内部也是new)。
结束对象引用:设置为null或引用其它、超出作用域、调用Destory( )。
ToString装箱,给托管带来的负担
装箱就会产生引用对象,引用对象多了就会给托管堆造成负担,应尽量避免。
负面例子:
// 以下用法不好public class ExampleScript : MonoBehaviour { void ConcatExample(int[] intArray) { string line = intArray[0].ToString(); for (i = 1; i < intArray.Length; i++) { line += ", " + intArray[i].ToString(); } return line; }}
循环每次调用ToString产生堆上的引用对象然后又结束引用。类似用法应避免,使用System.Text.StringBuilder来代替。
另一个例子:
// 以下用法不好// 每帧更新分数,也会给托管带来负担。void Update() { string scoreText = "Score: " + score.ToString(); scoreBoard.text = scoreText; }// 应该这样// 加个判断,没必要就不更新void Update() { if (score != oldScore) { scoreText = "Score: " + score.ToString(); scoreBoard.text = scoreText; oldScore = score; } }
函数返回一个数组,给托管带来负担
这也是个负面的例子:
// 每次调用都会分配一块内存void RandomList(int numElements) { var result = new float[numElements]; for (int i = 0; i < numElements; i++) { result[i] = Random.value; } return result; }// 不会产生额外分配void RandomList(float[] arrayToFill) { for (int i = 0; i < arrayToFill.Length; i++) { arrayToFill[i] = Random.value; } }
Garbage Collection的2个策略
这2个策略是Unity官方文档提供的,没必要盲目使用。
1)小heap快速且经常的GC策略。200kb的堆在iphone3G上大概需要5ms,1mb则需要7ms。
if (Time.frameCount % 30 == 0){ System.GC.Collect();}
2)大heap慢速且不经常的GC策略。避免在需要流畅运行中发生GC动作(如打斗场景中)。以下代码手动扩展了堆大小,从而影响系统策略。
void Start() { var tmp = new System.Object[1024]; // make allocations in smaller blocks to avoid them to be treated in a special way, which is designed for large blocks for (int i = 0; i < 1024; i++) tmp[i] = new byte[1024]; // release reference tmp = null; }
pool
可以借助reuseable object pools来牺牲一些内存换取效率,也就是复用gameobject(应该释放但不释放)。甚至有可能在需要流畅运行的场景中不调用Instantiate和Destroy来避免瞬时卡顿,可提前建立pool里所有的gameobject。
- C#笔记 垃圾回收garbage collection
- 垃圾回收(garbage collection)介绍
- android垃圾回收garbage collection
- JavaScript的垃圾回收(Garbage Collection)
- Garbage collection--垃圾回收机制(java)
- Java垃圾回收(garbage collection)介绍
- 7. 垃圾回收(Garbage Collection)
- PHP垃圾回收机制(Garbage Collection . GC)
- Java垃圾回收GC(Garbage Collection)
- GC(Garbage collection)垃圾回收
- Java的垃圾回收(Garbage Collection)机制
- Java的垃圾回收(Garbage Collection)机制
- Java的垃圾回收(Garbage Collection)机制
- Java的垃圾回收(Garbage Collection)机制
- Java的垃圾回收(Garbage Collection)机制
- Java的垃圾回收(Garbage Collection)机制
- Java的垃圾回收(Garbage Collection)机制
- JVM学习之垃圾回收(GC:garbage collection)
- 收集的java一些资料
- Unity3D 游戏引擎之控制模型移动旋转与碰撞
- hdu 1016 Prime Ring Problem
- 一、通过发送系统广播让android关机、重启
- CoreAnimation编程指南(六)动画
- C#笔记 垃圾回收garbage collection
- ROS学习手记12 -- ROS问题检测工具roswtf
- Activity Intent Flags及Task相关属性
- 我的书单和简单书评(持续更新)
- properties操作。
- Unity3D研究之与根据动态的两个轨迹点绘制面详解
- 当大数据遇见应用性能管理(概念篇①)
- CoreAnimation编程指南(七)图层Action
- Spring-Controller单元测试