首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何管理HoloLens 2上的内存泄漏?

如何管理HoloLens 2上的内存泄漏?
EN

Stack Overflow用户
提问于 2022-03-31 14:59:23
回答 1查看 225关注 0票数 0

我有一个客户服务器应用程序。HoloLens 2是我的客户端,使用UDP与服务器进行通信。我的MRTK分析器向我展示了应用程序会逐渐消耗内存,并且在2-3分钟后应用程序崩溃。我从服务器向HoloLens发送一些数据包。我试着打电话给GC,但也不起作用。我试图删除使用块和线程,但结果没有改变。我只使用一个端口。我是否应该连接、获取数据包并处理每个数据包的套接字?(这是一个非常糟糕的解决方案)不管怎样,我知道如何解决这个漏洞吗?

代码语言:javascript
复制
private void Socket_MessageReceived(Windows.Networking.Sockets.DatagramSocket sender,
Windows.Networking.Sockets.DatagramSocketMessageReceivedEventArgs args)
{
    //Read the message that was received from the UDP  client.
    Stream streamIn = args.GetDataStream().AsStreamForRead();
    MemoryStream ms = Task.Run(() => ToMemoryStream(streamIn)).Result;
    byte[] msgData = ms.ToArray();
    ThreadManager.ExecuteOnMainThread(() =>
    {
        Task.Run(() => HandleData(msgData));
     });
}

private async Task<MemoryStream> ToMemoryStream(Stream input)
{
    try
    {
        using (MemoryStream ms = new MemoryStream())
        {
            // Read and write in blocks of 4K.
            byte[] block = new byte[0x1000];
            while (true)
            {
                int bytesRead = input.Read(block, 0, block.Length);
                if (bytesRead == 0)
                {
                    return ms;
                }
                ms.Write(block, 0, bytesRead);
            }
        }
    }
    finally { }
}

private async System.Threading.Tasks.Task HandleData(byte[] data)
{
    using (Packet packet = new Packet(data))
    {
        int packetLength = packet.ReadInt();
        data = packet.ReadBytes(packetLength);
    }
        
    ThreadManager.ExecuteOnMainThread(() =>
    {
        using (Packet packet = new Packet(data))
        {
            int packetId = packet.ReadInt();
            // Call appropriate method to handle the packet
            _packetHandlers[packetId](packet); 
        }
    });
}   

内存工具的更新:

EN

回答 1

Stack Overflow用户

发布于 2022-04-19 13:53:44

对于这个版本,报告使用了统一更新版本和流类。下面是显示建议的帖子:https://forum.unity.com/threads/hololens-udp-client-with-datagramsocket-and-memory-leak.583816/

"Stream streamIn = args.GetDataStream().AsStreamForRead();

IL2CPP构建中的大量内存泄漏。重写消息接收代码以不使用Stream类,如下面的示例所示,消除了内存泄漏,在Unity2018.2.18f1中进行了测试“

代码(CSharp):

代码语言:javascript
复制
using (var reader = args.GetDataReader())
{
            var buf = new byte[reader.UnconsumedBufferLength];
            reader.ReadBytes(buf);
            string message = Encoding.UTF8.GetString(buf);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71694830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档