如何在RMI调用中释放服务器端资源?

时间:2015-02-04 14:49:16

标签: c# .net memory-management

我们的应用程序是基于客户端服务器的应用程序,我已将其从.NET远程处理转换为ZMQ。我们有两种情况,其中大图像对象被转换为字节数组,以便被序列化并发送到客户端。为了减少内存问题(Large Object Heap),我们有一个用于此过程的字节数组池,从而不再分配和释放它们。

我遇到的问题是,在类似RMI的调用中返回数组后,我不知道如何在池中将字节数组标记为“free”。

public byte[] GetImageAreaGrey(int imageId)
    {
        var image = FindImageById(imageId);
        byte[] byteHolder = BytePool.GetFreeArray();
        ByteConverter.ConvertImageToBytes(image, byteHolder)
        return byteHolder ; // byteHolder will be serialized in the communications code using JSON.NET
        // How do I return byteHolder to the pool so that is available for future use?
    }

应用程序是用C#编写的.NET 4.5运行时,我们正在尝试防止大对象堆碎片化。

编辑:澄清原始字节[]正在返回。

1 个答案:

答案 0 :(得分:-2)

旧答案:池必须跟踪哪些阵列是空闲的,哪些是使用的。您需要针对免费和非免费阵列的单独集合。这是任何游泳池的基本要求,所以我不确定你在说什么样的游泳池。

新答案:阅读评论后,我更好地理解了这个问题。您希望将一个字节数组返回到池中,但是字节数组已作为返回值返回给由外部代码调用的方法。这是个问题吗?您无法将其返回到池中,因为您不知道外部代码何时完成字节数组。你不能使用游泳池。

要使用池,您必须反转控制顺序。您的代码必须使用字节数组作为输入参数来调用外部代码。