2010-10-14 26 views
0

目的:

將數據從傳入的UDP數據報傳遞到4個等待其各自隊列的線程。 應用程序應該不間斷地將流量泵送到DUT並處理傳入的消息。 這是我在做什麼:用於傳入UDP數據包的靜態內存

1. Public byte[] receiveData = new byte[512] 
2. receivePacket = new DatagramPacket(receiveData, 0 , receiveData.length) 
[The above 2 steps are in constructor of the listener class] 
3. while (1) 
a. ApplicationStart.serversocket.receive(receivePacket) 
b. recvData = new String(receivePacket.getData() 
. 
. {Processing of data} 
. 

c. recvData = null 

問題:

的內存不斷增加。我懷疑這是因爲它正在等待GC聲稱未使用的內存。我希望我可以在無限while循環之外分配一些靜態內存。如果我這樣做,我面對的問題是「receivePacket.getData()」返回一個字節數組並處理數據,我需要將它轉換爲一個字符串。所有的數據都是文本格式(具體是MGCP數據包)。 請建議任何方式以確保內存未耗盡。 我不想手動調用垃圾收集器。我不確定GC的開銷。

感謝

+0

什麼是你的標題有你的問題呢? – EJP 2010-10-14 07:05:43

+0

張貼一些code.That將有助於理解這個問題。 – Emil 2010-10-14 10:08:12

回答

0

首先,你應該不需要手動調用GC,這通常是一個壞主意,這樣做。

話雖如此,目前還不清楚你的意思是「記憶力不斷增加」。

如果您的意思是您的應用程序的內存分配從外部觀察增加,那麼這是正常的。 Java將盡可能分配新對象,並且只在沒有空間立即可用時運行GC。從外部看,它看起來像JVM使用越來越多的內存。

如果你指的是JVM報告它正在運行的堆空間(即拋出的OutOfMemoryError),那麼你有問題。但是,這個問題將不會通過運行GC來修復。相反,您需要運行Java內存分析器來查找泄漏源並進行修復。在C/C++中,當應用程序不再需要時忽略對象free/delete,就會發生泄漏。在內存泄漏的情況下(例如,C/C++內存泄漏) Java,當你的應用程序不小心引用一個不再使用的對象時,會發生內存泄漏。如果GC認爲應用程序可能再次使用該對象,它就無法回收它...因此對象留在附近)。

0

好吧。我當然希望它的功課,而不是一個外包項目......

回答您的實際問題:

您可以創建多個預分配的數據包,並把它們添加到隊列。 從隊列的開始處獲取已獲得的軟件包並接收它。 當處理程序線程處理了數據包時,它將它放在隊列的後面。

步驟3.B應該避免,因爲它創建了一個新的字節數組和拷貝從分組到它的內容,所以重寫線程來處理分組(或字節數組)作爲輸入。

有可能你接收數據包的速度比你能處理的速度快;然後你的代碼將用完所有的內存。(當你分配包和字符串,並把它們在處理程序線程的隊列。)

如果您使用的是阻塞隊列,並等待‘免費’包讀入,不會發生的;至少不會以同樣的方式。 UDP數據包將被(或可能兩者)在OS的或Java類網絡堆棧的地方掉落或緩衝,所以你需要採取照顧。這就是爲什麼大多數「信息導向」的協議結束了使用TCP/IP,雖然他們實際運輸「數據報」