当前位置:首页 > 内存 > 正文

unity数组释放内存

  • 内存
  • 2024-06-26 03:47:42
  • 3391

一、Mono源码阅读-GC造成内存泄露问题本文主要记录Unity游戏不可避免地会因为Mono源码中的GC问题而出现某些内存泄漏问题的底层原因,包括Mono源码中GC机制的逻辑。
要发生这种内存泄漏,首先要准备一个随机内存块:(没有任何外部引用,理论上使用后应该被GC,但是在这个错误下会错误地泄漏,GC没丢)
注意:大小是随机的,越大越容易泄漏。
struct结构体的数组:(struct必须有一个类似指针的值类型,如int,和另一个引用类型,如string)
注意:任意大小,矩阵中元素数量越多,越容易造成泄漏。例如,HashSet在内部使用此数据格式。
通过在GC中设置点,并使用GDB调用GC过程,以监控所有对象的分配和GC过程,我们发现缓冲区对象被对象槽错误引用,导致对象无法正常GCed。
首先,对于mono/il2cpp的BoehmGC库来说,mono/il2cpp对象分配内存时,有以下几种类型:
本例中:slots的分配使用NORMAL类型,并且缓冲区对象使用PTRFREE类型分配。
所以在进行GC时,对于slots对象,GC会扫描该对象的内存范围,找到其内部指针地址,即从地址0xde45f000到0xde468c50,根据找到指针地址指针对齐方式:
例如:0xde45f0000xde464d440xde464f400xde46513c......
0xde464f40的地址值恰好是:0xbe82f000(即slot结构体中的哈希码值),GC会误认为int值作为指针,而恰好这个指针指向了GC管理的一块内存,即buffer对象,所以GC认为buffer对象是由slot对象内部引用的,而buffer对象是也被GC标记,不会被释放。
这个问题的关键在于,GC错误地将slot结构体中的哈希码的int值视为指针,而该int值指向另一个托管对象,因此GC错误地将两个作为指针的对象之间存在引用关系,这使得导致内存泄漏。
最小化演示:
将structSlot更改为classSlot以修复内存泄漏问题,因为类对象的内存分配是TYPED类型。
由于Mono的GC设计问题,随着时间的推移,Unity游戏中几乎不可避免地会出现内存泄漏,因为这个问题会出现在HashSet等数据结构中。但我们能做的仍然是关于内存使用的两个关键事实(尤其是在虚拟机语言中):
这样,我们不能完全避免Mono中的基本GC问题,但它可以使这个内存逐渐泄漏。


二、unity加载外部音乐如何放进数组?1、创建一个Unity3d项目,新建一个C#脚本并自行命名。
2双击脚本并添加数组变量publicObject[]shapes=null;
3.
4新建三个球体,将球体拖放到对象数组变量中进行赋值。

上一篇:华为云计算机房

下一篇:unity清内存