2015-02-04 31 views
1

我们的应用程序是基于客户端 - 服务器的应用程序,我已经从.NET Remoting转换为ZMQ。我们有两种情况,一个大型图像对象被转换为一个字节数组以便序列化并发送到客户端。为了减少内存问题(大对象堆),我们有一个用于这个过程的字节数组池,因此不需要经常分配和释放它们。如何在RMI调用中释放服务器端资源?

我遇到的问题是,我不知道如何在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? 
    } 

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

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

+0

RMI调用返回后是否有资格进行垃圾回收? – 2015-02-04 15:17:08

+0

这不是垃圾收集......这是拥有阵列池的关键。我将阐明这是一个C#.NET 4.5应用程序。 – 2015-02-04 15:21:24

+0

我明显错过了关于资源池的部分。 – 2015-02-04 15:23:23

回答

-2

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

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

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

+0

我很清楚,该池负责跟踪可用和使用的阵列。我遇到的问题是,在某些情况下,没有明确的机制来通知池,阵列不再被使用,因此可用于重新使用。 – 2015-02-07 22:43:16

+0

@DaveNay一个池有一个“分配”或“检索”的方法,和一个“免费”的方法。如果没有任何方法来重新使用这个对象,它怎么能被称为“池”? – 2015-02-10 16:55:11

+0

是的,我知道。我不问如何创建一个对象池。请将您所描述的“Pool.Free(byte [])”调用放入我描述的场景中。这是我有困难的地步。 – 2015-02-10 17:18:36