2010-10-14 40 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,虽然他们实际运输“数据报”