将数据从传入的UDP数据报传递到等待各自队列的4个线程。 该应用程序应该不间断地工作,以便将流量泵送到DUT并处理传入的消息。 这就是我在做的事情:
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声明未使用的内存。我希望我可以在无限循环之外分配一些静态内存。如果我这样做,我面临的问题是“receivePacket.getData()”返回一个字节数组并处理数据,我需要将其转换为字符串。所有数据都是文本格式(具体来说就是MGCP包)。 请建议任何方法,以确保内存不会耗尽。 我不想手动调用垃圾收集器。我不确定GC的开销。
由于
答案 0 :(得分:0)
首先,您不需要手动调用GC,这通常是个坏主意。
话虽如此,目前还不清楚你的意思是“记忆力不断增加”。
如果您的意思是从外部观察到的应用程序的内存分配正在增加,那么这是正常的。 Java将尽可能地分配新对象,并且只在没有空间立即可用时运行GC。从外部看,JVM似乎正在使用越来越多的内存。
如果您的意思是JVM报告它的堆空间不足(即通过抛出OutOfMemoryError),那么您就遇到了问题。但是,运行GC无法解决此问题 。相反,您需要运行Java内存分析器来查找泄漏源,并进行修复。
(背景:Java内存泄漏与(例如)C / C ++内存泄漏有点不同。在C / C ++中,当您的应用程序忽略了free
/ delete
对象时,会发生泄漏在Java中,当您的应用程序意外保持对不再使用的对象的引用时,会发生内存泄漏。如果GC认为应用程序可能使用该对象再次,它无法回收它...因此物体停留在周围。)
答案 1 :(得分:0)
好。我当然希望它的功课而不是外包项目...
回答你的实际问题:
您可以创建许多预分配的数据包,并将它们添加到队列中。 从队列的开头抓取一个已用过的包,然后接收它。 当处理程序线程处理了数据包时,它将它放在队列的后面。
应避免使用步骤3.b,因为它会创建一个新的字节数组并将数据包中的内容复制到其中,因此重写线程以处理数据包(或字节数组)作为输入。
您收到的数据包可能比处理数据包的速度快;然后你的代码将耗尽所有内存。 (当您分配数据包和字符串并将它们放入处理程序线程的队列中时。)
如果您正在使用阻塞队列,并等待“免费”数据包读入,则不会发生;至少不是以同样的方式。 UDP数据包将在OS或javas网络堆栈中的某处丢弃或缓冲(或可能同时),因此您需要处理这些问题。这就是为什么大多数“面向消息的”协议最终使用TCP / IP,尽管它们实际上传输“数据报”