无垃圾工作的Java UDP库

无垃圾工作的Java UDP库,java,garbage-collection,udp,real-time,Java,Garbage Collection,Udp,Real Time,我正在寻找一个无垃圾的UDP Java库。 原因是我正在为实时系统开发一个守护程序应用程序。 我的要求是每个请求的延迟5微秒(从到达我的套接字到响应到达目的地) 有两个消息传递服务支持UDP且不产生垃圾(&),但都要求所有通信组件都使用平台 我的情况是,我无法控制其他组件,我只知道我要将UDP消息发送到套接字,我需要在不产生任何垃圾的情况下处理它们 如果你有任何想法,我将不胜感激:)你说没有垃圾是什么意思?在UDP中,您可能会丢失消息,这是该协议固有的。如果您想在UDP之上有一些可靠性,您需要有

我正在寻找一个无垃圾的UDP Java库。 原因是我正在为实时系统开发一个守护程序应用程序。 我的要求是每个请求的延迟5微秒(从到达我的套接字到响应到达目的地)

有两个消息传递服务支持UDP且不产生垃圾(&),但都要求所有通信组件都使用平台

我的情况是,我无法控制其他组件,我只知道我要将UDP消息发送到套接字,我需要在不产生任何垃圾的情况下处理它们


如果你有任何想法,我将不胜感激:)

你说没有垃圾是什么意思?在UDP中,您可能会丢失消息,这是该协议固有的。如果您想在UDP之上有一些可靠性,您需要有一个额外的层来管理ACK、重传等。。这意味着您的生产者和消费者应用程序必须使用此层API来发送/接收消息。

一个非常简短的示例如下:

导入java.lang.System;
公共类UdpNoGc{
公共静态void main(字符串[]args)引发异常{
var buf=新字节[1024];
var pkt=newjava.net.DatagramPacket(buf,buf.length);
try(var sock=newjava.net.DatagramSocket(4321)){
对于(;;){
短袜接收(pkt);
System.out.write(buf,0,pkt.getLength());
gc();
}
}
}
}
显式的
System.gc()
调用就在那里,因此您可以使用以下命令运行:

java“-Xlog:gc,heap*”UdpNoGc

并确保启动后不会分配任何内容。请注意,在Java中编写不分配的代码有些困难,使用另一种提供更多支持的语言可能会更容易。

您能更具体一点吗?似乎可以使用标准
java.net
stuff而不产生垃圾。只需提前完成所有分配,事情就会好起来。你说的“无垃圾”是什么意思?@NomadMaker我的意思是,为了防止GC“停止世界”,我不想产生垃圾行为。@SamMason你的意思是预分配一个
DatagramPacket
对象池并重用它们吗?@SamMason根据你的说法,你不能重用
DatagramPacket
,但你可以重用内容(缓冲区),这样可以减少垃圾量,但无法消除它。我的意思是,我不想为了防止GC“停止世界”行为而生成垃圾。好的,那么如果您使用ORACLE JVM(Linux和Windows),建议使用G1GC垃圾收集器。谢谢@SamMason,这非常有帮助!不幸的是,我仅限于Java,所以希望这个解决方案能起到作用。