2015-02-04 63 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