Unity 处理mono内存(堆内存)泄露问题

先讲解一下mono特性

一个很重要的信息:mono内存从系统里面申请的内存不会返回给系统

mono内存不足的时候会预申请内存(内存大小不定有可能10m有可能5m)

最近优化一个mono内存泄露问题

引起mono一直撑大多数都是内存泄露,要不就是一下子申请很大块内存

我这里主要说内存泄露,这个更难查

现在正常项目很多脚本不继承MonoBehaviour,实例化出来的对象,要及时处理生命周期,避免内存泄露,内存泄露导致mono一直撑大,然后内存一直涨而且不会返还给系统,导致游戏闪退

比如我项目中角色上各种控制器:数据控制器,buff控制器,武器控制器,技能控制器这些都是不继承MonoBehaviour,这些对象系统判断没引用就会回收,不过游戏战斗复杂各种引用导致对象没有释放(因为MonoBehaviour有生命周期就算被引用也会释放)。

我写个简单的例子如何内存泄露

using System.Collections.Generic;
using UnityEngine;

public class test : MonoBehaviour {

    test1 t;
    test1 t1;

    void Start ()
    {
        t = new test1();
        t1 = new test1();
        for (int i = 0; i < 10000; i++)
        {
            t.list.Add(new test2());
        }
        t1.list = t.list;
        t = null;
        //释放t,然后t1引用t.list导致t.list无法回收
        //处理方法 t.list.Clear();t1 = null;
    }
}

public class test1
{
    public List<test2> list = new List<test2>();
}

public class test2
{
    int[] a;
    public test2()
    {
        a = new int[1000];
    }
}

看看数据,一直没有回收t.list

如果想回收t.list,加t1 = null;或者t.list.Clear();

下面是加了t.list.Clear();的结果

总结一下

不继承MonoBehaviour的对象是根据没有引用才释放,如果引用复杂可能导致不回收,从而导致内存泄露

1.对象不用的时候手动设置为null标记去回收就可以解决

2.对象里面的列表数组字典,清对象之前全部清掉

如果嵌套比较多的更加要注意

发布了63 篇原创文章 · 获赞 37 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/SnoopyNa2Co3/article/details/103934622