当前位置:网站首页>Unity GC
Unity GC
2023-01-19 15:33:03【阿斯提尼】
GC(Garbage Collection)就是让内存重新可被使用的过程。栈内存中的数据一旦超出作用域就会被立即释放不会引发GC,堆内存中的数据超出作用域不会被立即释放,只能通过GC进行释放。
首先当一个存放在堆中的变量被创建时,会经历以下步骤:
1:Unity首先检查堆中是否有足够的闲置内存,如果有则立即分配
2:如果没有足够的闲置内存,Unity就会触发GC释放掉一部分垃圾内存(过程可能很慢),如果释放后有了足够的闲置内存则进行分配
3:如果经过GC之后还没有足够的闲置内存,Unity就会拓展整个堆的内存(过程可能很慢)来进行分配
GC会在以下情况下触发:
1:堆内存中的闲置内存不够给当前新建的对象分配
2:GC会时不时的自动运行
3:GC可以被手动触发
每一次GC会经历以下过程,堆上的对象越多,对象的引用越多,意味着GC所做的工作越多
1:GC会检查堆上所有的对象
2:GC会检查所有这些对象的引用是否仍在作用域
3:每个不在作用域的对象都会被标记为待删除
4:GC删除每个待删除的垃圾对象
GC频繁的调用或者GC的时间过长不仅可能造成游戏的卡顿还会造成堆碎片(heap fragmentation)问题
堆碎片:因为堆内存可以被分配成小的可用内存块,所以可能当一些内存块被回收之后,虽然总的内存量很高,但是却没有大的内存块分配给大的数据对象。堆碎片问题会造成游戏运行使用的内存大于它实际需要内存的问题也会造成频繁的GC。
降低GC的影响可以从以下几个方面入手:
1:降低GC执行过程的时间
2:降低GC的执行频率
3:尝试在合适的时间(在对表现要求不高时比如加载界面时)手动调用GC与内存扩展,这是一个比较困难与不可靠的方法,不过在进行全局内存管理降低GC的影响时有一定的作用。
减少垃圾的产生可以从以下几个方面入手:
1:使用缓存
2:不要在被频繁调用的方法中分配内存
3:使用clear代替每次new一个集合
4:采用对象池技术
我们经常使用string,而string是引用类型所以也会产生不少垃圾,减少使用string带来的垃圾的途径如下:
1:该string字段如果使用不止一次就采用缓存将它缓存起来复用
2:减少对string的操作如拼接,因为string类型的字段自创建时起就是不变的,每次拼接都会分配一个新内存并且废弃一个旧内存(如Time:01:22倒计时,可以将“Time:”单独提取成Text,每次只改变时间)
3:如果必须要对string进行操作就使用StringBuilder(可理解成可变的string类型),在使用它操作字符串时不会新申请内存和废弃旧内存
4:当Debug.Log不用时应立即删除,因为它会至少生成或处理一个字符串
手动调用GC代码:System.GC.Collect();
边栏推荐
猜你喜欢
随机推荐
- 负电压是怎么产生的原理分析
- 迟滞比较器Hysteresiswindow和comparator(窗口比较器)原理
- 残留物与电子PCBA 的可靠性和三防漆涂敷前后可能导致电路板出现故障的变量
- 京东探索研究院 | 2023年十大科技趋势
- A variety of Chinese dialect voice landing applications, Microsoft's intelligent voice unlocks more interactive scenarios
- Is Alipay's annuity insurance worth buying?is it safe?
- Which is the top ten insurance for annuity insurance? Is it safe?
- Use MeterSphere beanshell global assertion reference JSONObject solution
- CNN+LSTM+Attention实现时间序列预测(PyTorch版)
- WebView加载heml代码简单应用
- CTA-Sensitive Behavior-AppOps Solution
- Beyond TensorFlow?Yann LeCun: "Why? PyTorch. That's why."
- 蜻蜓安全工作台程序编排简要说明
- WSL2安装systemd方法
- 安信证券开户安全吗?佣金是万几?
- 大智慧在上面开户安全吗?谁能告诉我一下
- 从合并石子学区间DP
- Golang的基本数据类型-基本使用
- 线扫相机DALSA--卡间同步
- 海康visionmaster-图像Bitmap和CmvdImage互转的方法
- 【threejs】根据点绘制直线
- 【threejs】threesjs 初学场景构建
- 第十三章 UML建模
- 为什么很多年轻人,都被 “伪自律” 给拖垮了?
- 小黑年前实习倒数第二天,又到了开心的疯狂星期四的leetcode之旅:剑指 Offer 27. 二叉树的镜像&&剑指 Offer 28. 对称的二叉树
- Servlet —— Servlet API
- 使用nvm管理node版本(window版)
- typescript学习笔记(三)
- vtkPolyData数据的空间变换
- 深入透析 类的 访问修饰符 public、 protected 、private
- C语言基础 — ( 函数——模块化设计)
- Wider Face+YOLOV8人脸检测
- Wider Face+YOLOV7人脸检测
- 【Android安全】Google Hardware-backed Keystore | SafetyNet | 远程证明Remote Attestation
- [转]SteamVR 1.x️一、实现手与物体交互——基于[CameraRig]
- PHP MySQL Where 子句
- PHP MySQL Order By 关键词
- 我理解的卓越工程
- 各种huggingface分词器对比
- PHP MySQL Order By keywords




