Java 用于传入UDP数据包的静态内存 目标:

Java 用于传入UDP数据包的静态内存 目标:,java,udp,datagram,Java,Udp,Datagram,将来自传入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 c

将来自传入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声明未使用的内存。我希望我能在无限while循环之外分配一些静态内存。如果这样做,我面临的问题是“receivePacket.getData()”返回一个字节数组,要处理数据,我需要将其转换为字符串。所有数据都是文本格式(具体来说是MGCP数据包)。 请建议任何确保内存未耗尽的方法。 我不想手动调用垃圾收集器。我不确定GC的开销


首先,您不需要手动调用GC,这样做通常不是一个好主意

话虽如此,不清楚你所说的“记忆在不断增长”是什么意思

如果从外部观察到应用程序的内存分配在增加,那么这是正常的。Java将尽可能长时间地分配新对象,并且只在没有立即可用的空间时运行GC。从外部看,JVM似乎正在使用越来越多的内存

如果您的意思是JVM报告堆空间不足(即抛出OutOfMemoryError),那么您就有问题了。但是,运行GC无法解决此问题。相反,您需要运行Java内存探查器来查找泄漏源并修复它


(背景:Java内存泄漏与(例如)有些不同)C/C++内存泄漏。在C/C++中,当应用程序在不需要的时候忽略了<代码>自由<代码> >代码>删除>代码>。在爪哇,当应用程序意外地保存对不再使用的对象的引用时,内存泄漏发生。如果GC认为应用程序可能使用对象,它无法回收它…因此该对象仍然存在。)

很好。我当然希望它的作业,而不是离岸项目

回答您的实际问题:

您可以创建许多预分配的数据包,并将它们添加到队列中。 从队列的开头抓取一个使用过的包,并接收到它。 当处理程序线程处理完数据包后,它会将其放在队列的后面

应该避免步骤3.b,因为它创建了一个新的字节数组并将数据包中的内容复制到其中,所以重写线程以处理数据包(或字节数组)作为输入

您接收数据包的速度可能快于您处理数据包的速度;然后你的代码将耗尽所有内存。(当您分配数据包和字符串并将它们放入处理程序线程的队列时。)


如果您正在使用阻塞队列,并等待“空闲”数据包读入,则不会发生这种情况;至少不是这样。UDP数据包将在操作系统或Java网络堆栈中的某个位置被丢弃或缓冲(或者两者都被丢弃或缓冲),因此您需要注意这一点。这就是为什么大多数“面向消息”的协议最终使用TCP/IP协议,尽管它们实际上传输“数据报”

你的标题与你的问题有什么关系?发布一些代码。这将有助于理解问题。