Amotiny 2021-02-02 21:59 采纳率: 0%
浏览 52

ILRuntime热更工程怎么释放内存

ILRuntime热更工程怎么释放内存

在热更工程中用数组保存的本地类对象,在重新创建时怎么释放原来的内存?

class MyStrct
{
        public int intParam;
        public string strParam;
        public GameObject objParam;
        public Transform tranParam;

        public void clear()
        {
            objParam = null;
            tranParam = null;
        }
}

class MemTest
    {
        private string name = "MemTest";
        public MyStrct[] myBytes = null;

        public void OnInit()
        {
            myBytes = new MyStrct[6];
        }


        public void CreateMB()
        {
            for (int i = 0; i < myBytes.Length; i++)
            {
                myBytes[i] = new MyStrct();
                myBytes[i].intParam = i * 10;
                myBytes[i].strParam = i + "随便填写的内容";
            }
                
        }

        public void Clean()
        {
            for (int i = 0; i < myBytes.Length; i++)
            {
                myBytes[i].clear();
                myBytes[i] = null;
            }
        }

        public void Destroy()
        {
            for (int i = 0; i < myBytes.Length; i++)
            {
                myBytes[i].clear();
                myBytes[i] = null;
            }
                
            myBytes = null;
        }
    }

在某一时刻我像重置 myBytes 中数据 回再次调用 CreateMB方法 之后也会调用 clean 和Destroy 方法,但内存都不见掉下来!

怎么释放 ILRuntime 映射工程中创建的内存?

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-24 13:09
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在使用ILRuntime进行热更新的时候,确实需要注意内存管理。以下是一些建议和步骤:

    1. 使用System.Runtime.InteropServices.Marshal.ReleaseComObject():这将确保任何未使用的引用被正确地销毁。

    2. 在循环中避免对myBytes数组的所有元素同时进行修改,因为这可能导致不可预测的行为。

    3. 尽量不要直接操作MyStrct类型的实例,而是通过反射或其他方式获取它们的引用。

    4. 使用GC.Collect()GC.WaitForPendingFinalizers()来触发垃圾回收,以确保所有不再使用的资源都被释放。

    5. 当你完成工作后,记得清理你的内存池(如果有的话),例如通过MemoryManager.Clear();

    下面是一个示例代码片段,展示如何使用这些技巧:

    using System;
    using System.Runtime.InteropServices;
    
    public class Program
    {
        public static void Main()
        {
            // 创建一些临时的对象
            var tempObjects = new MyStrct[6];
    
            // 初始化
            for (int i = 0; i < tempObjects.Length; i++)
            {
                tempObjects[i] = new MyStrct { intParam = i * 10, strParam = $"i{ i }" };
            }
    
            // 清理
            for (int i = 0; i < tempObjects.Length; i++)
            {
                tempObjects[i].clear();
            }
    
            // 现在可以安全地释放内存了
            GC.Collect();
        }
    }
    

    在这个例子中,我们首先初始化了一些临时的MyStrct对象,并且在创建完所有的对象后,我们调用了GC.Collect()来释放它们的内存。这样就可以确保在没有意外的情况下,所有的内存都已经被正确地释放掉了。

    评论

报告相同问题?

悬赏问题

  • ¥15 内网办公电脑进行向日葵
  • ¥15 如何输入双曲线的参数a然后画出双曲线?我输入处理函数加上后就没有用了,不知道怎么回事去掉后双曲线可以画出来
  • ¥50 WPF Lidgren.Network.Core2连接问题
  • ¥15 soildworks装配体的尺寸问题
  • ¥100 有偿寻云闪付SDK转URL技术
  • ¥30 基于信创PC发布的QT应用如何跨用户启动后输入中文
  • ¥20 非root手机,如何精准控制手机流量消耗的大小,如20M
  • ¥15 远程安装一下vasp
  • ¥15 自己做的代码上传图片时,报错
  • ¥15 Lingo线性规划模型怎么搭建